Swift 2:“Set<UITouch>”类型的值没有成员“anyObject”[重复]

Posted

技术标签:

【中文标题】Swift 2:“Set<UITouch>”类型的值没有成员“anyObject”[重复]【英文标题】:Swift 2: Value of type 'Set<UITouch>' has no member 'anyObject' [duplicate] 【发布时间】:2015-12-19 18:08:04 【问题描述】:

我检查了我的旧游戏,我想在 Swift 2.0 中更新它。当我试图修复它时,Xcode 发现了一个错误。错误是 “Set”类型的值在这行代码中没有成员“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))

那么这里要解决什么问题呢?

【问题讨论】:

那里的答案不清楚。 【参考方案1】:

给定 SetUITouch 定义如下

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

【讨论】:

是的,它正在工作。谢谢先生:) 太好了,祝你的游戏好运! 我愿意提供帮助,但您应该创建一个新问题。 这是另一个问题 - ***.com/questions/34374830/…

以上是关于Swift 2:“Set<UITouch>”类型的值没有成员“anyObject”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift

将版本更改为 Swift 1.2 而不是 Swift 2.1

将 swift 2.3 转换为 swift 3 错误

迁移到惯用的 Swift 2 的清单(又名 Swift 2 转换指南在哪里)?

Swift 到 Swift 2 [重复]

swift 2.2 语法 (上)