【问题标题】:How to use "enumerateChildNodesWithName" with Swift in SpriteKit?如何在 SpriteKit 中将“enumerateChildNodesWithName”与 Swift 一起使用?
【发布时间】:2014-06-13 20:31:52
【问题描述】:

我正在使用 Swift 在 SpriteKit 中制作游戏。

在 Objective-C 中我可以使用以下方法:

 (void)enumerateChildNodesWithName:(NSString *)name usingBlock:(void (^)(SKNode *node, BOOL *stop))block

对该*node 执行操作,但我无法在 Swift 中使用此功能。基本上,我不知道如何在 Swift 中引用该节点。

这是我正在使用的代码,但我在使用“usingBlock:”部分时遇到了问题。我已经尝试了很多小时,但没有成功。请帮忙!

func spawnEnemy() -> () {
  let enemy = SKSpriteNode(imageNamed: "enemy")
  enemy.name = "enemy"
  enemy.position = CGPointMake(100, 100)
  self.addChild(enemy)
}

func checkCollisions() -> () {
  self.enumerateChildNodesWithName("enemy", usingBlock: ((SKNode!, CMutablePointer<ObjCBool>) -> Void)?)
}

【问题讨论】:

    标签: objective-c-blocks swift enumeration


    【解决方案1】:

    目前,不要相信自动完成功能会插入您需要的代码——它会从“标头”中放入签名,但块签名与为块参数插入自己的闭包时所需的声明不同.

    编写闭包的正式方法是在大括号内复制签名,添加本地参数名称并使用in 关键字标记闭包主体的开始:

    self.enumerateChildNodesWithName("enemy", usingBlock: {
        (node: SKNode!, stop: UnsafeMutablePointer <ObjCBool>) -> Void in 
        // do something with node or stop
    })
    

    但是 Swift 的类型推断意味着你不必写那么多。相反,您可以只命名参数,因为它们的类型(以及闭包的返回类型)是已知的:

    self.enumerateChildNodesWithName("enemy", usingBlock: {
        node, stop in 
        // do something with node or stop
    })
    

    你也可以使用尾随闭包语法:

    self.enumerateChildNodesWithName("enemy") {
        node, stop in 
        // do something with node or stop
    }
    

    (您甚至可以删除本地参数名称并按位置引用参数 - 例如,$0 for node - 但这里不是一个好地方,因为它使您的代码可读性大大降低。这是最好的保留 $0 和朋友的闭包,其中参数的含义非常明显,例如与 mapsort 一起使用的闭包。)

    请参阅Swift 编程语言中的Closures 以获得进一步的解释。


    另外,因为stopUnsafeMutablePointer,所以使用它的语法与在ObjC 中有点不同:设置stop.memory = true 以跳出枚举。

    【讨论】:

    • 使用 stop.memory = true 给了我一个错误,所以我使用了 stop.withUnsafePointer { $0.memory = true },推荐here
    • 好收获。编辑答案。
    • 但是在针对 iOS 7 (Xcode 6 b7) 时它似乎不起作用.. 有没有人做到这一点?
    • @Gatada: ObjC BOOL * 导入 API 中的类型再次更改... beta 5,我想?所以我们回到设置stop.memory。更新了答案。
    • 我不确定自从 6 月份的 Swift Beta 1 以来,BOOL * 参数已经改变了多少次它们导入的 Swift 类型。无论如何,在闭包语法中使用类型推断是一个很好的理由——如果你只写node, stop in,你就不必更改新 Xcode 版本的声明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多