Swift 2: 'Set<UITouch>' 类型的值没有成员 'anyObject'
Swift 2: Value of type 'Set<UITouch>' has no member 'anyObject'
我检查了我的旧游戏,我想在 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))
}
那么这里要解决什么?
给定 UITouch
的 Set
定义如下
touches: Set<UITouch>
您可以使用此代码检索触摸
let touch = touches.first
泛型
无需将检索到的元素强制转换为 UITouch
。事实上,现在用 Objective-C 编写的 Apple API 已经更新为泛型。这意味着在这种情况下,您会收到一个 Set
of UITouch
(而不是 Set
of NSObject
,它实际上可以包含任何对象)。
所以 Set
已经知道 包含的元素是 UITouch
.
可选
first
计算 属性 执行 return 和 Optional
。事实上,如果 Set
为空,它会 return nil
.
一个很好且安全的元素展开技术是
guard let touch = touches.first else {
debugPrint("Ops, no touch found...")
return
}
// here you can use touch
我检查了我的旧游戏,我想在 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))
}
那么这里要解决什么?
给定 UITouch
的 Set
定义如下
touches: Set<UITouch>
您可以使用此代码检索触摸
let touch = touches.first
泛型
无需将检索到的元素强制转换为 UITouch
。事实上,现在用 Objective-C 编写的 Apple API 已经更新为泛型。这意味着在这种情况下,您会收到一个 Set
of UITouch
(而不是 Set
of NSObject
,它实际上可以包含任何对象)。
所以 Set
已经知道 包含的元素是 UITouch
.
可选
first
计算 属性 执行 return 和 Optional
。事实上,如果 Set
为空,它会 return nil
.
一个很好且安全的元素展开技术是
guard let touch = touches.first else {
debugPrint("Ops, no touch found...")
return
}
// here you can use touch