Swift 2:类型'Set<UITouch>'的值没有成员'anyObject'。

7

我想更新我的旧游戏,使用Swift 2.0。当我尝试修复它时,Xcode发现了一个错误。错误出现在这行代码上:Value of type 'Set' has no member 'anyObject'

var touch:UITouch = touches.anyObject() as! UITouch

功能:

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {

    self.runAction(SKAction.playSoundFileNamed("torpedo.mp3", waitForCompletion: false))

    var touch:UITouch = touches.anyObject() as! UITouch //<-- Here is Error
    var location:CGPoint = touch.locationInNode(self)

    var torpedo:SKSpriteNode = SKSpriteNode(imageNamed: "torpedo")
    torpedo.position = player.position

    torpedo.physicsBody = SKPhysicsBody(circleOfRadius: torpedo.size.width/2)
    torpedo.physicsBody!.dynamic = true
    torpedo.physicsBody!.categoryBitMask = photonTorpedoCategory
    torpedo.physicsBody!.contactTestBitMask = alienCategory
    torpedo.physicsBody!.collisionBitMask = 0
    torpedo.physicsBody!.usesPreciseCollisionDetection = true

    var offset:CGPoint = vecSub(location, b: torpedo.position)

    if (offset.y < 0){
        return

    self.addChild(torpedo)

    var direction:CGPoint = vecNormalize(offset)

    var shotLength:CGPoint = vecMult(direction, b: 1000)

    var finalDestination:CGPoint = vecAdd(shotLength, b: torpedo.position)

    let velocity = 568/1
    let moveDuration:Float = Float(self.size.width) / Float(velocity)

    var actionArray:NSMutableArray =  NSMutableArray()
    actionArray.addObject(SKAction.moveTo(finalDestination, duration: NSTimeInterval(moveDuration)))
    actionArray.addObject(SKAction.removeFromParent())

    torpedo.runAction(SKAction.sequence(actionArray))
}

那么这里需要修复什么?

那里的答案不够清晰。 - user5537162
1个回答

8

假设有一个定义如下的UITouchSet

touches: Set<UITouch>

你可以使用这段代码检索触摸。
let touch = touches.first

泛型

不需要将检索到的元素强制转换为UITouch。实际上,现在使用Objective-C编写的Apple API已经更新为泛型。这意味着在这种情况下,您将接收一个UITouchSet(而不是可能包含任何对象的NSObjectSet)。因此,Set 已经知道包含的元素是UITouch

可选项

first计算属性确实返回一个Optional。实际上,如果Set为空,它会返回nil

一个好的、安全的技术来解包元素是

guard let touch = touches.first else {
    debugPrint("Ops, no touch found...")
    return
}

// here you can use touch

1
是的,它正在工作。谢谢您,先生 :) - user5537162
1
太棒了,祝你的游戏好运! - Luca Angeletti
2
我已经准备好帮忙了,但你应该创建一个新的问题。 - Luca Angeletti
1
这是另一个问题 - http://stackoverflow.com/questions/34374830/swift-2-cannot-convert-value-of-type-nsmutablearray-to-expected-argument-type - user5537162

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接