gpt4 book ai didi

objective-c-blocks - 如何在 SpriteKit 中使用 Swift "enumerateChildNodesWithName"?

转载 作者:IT王子 更新时间:2023-10-29 05:15:08 25 4
gpt4 key购买 nike

我正在使用 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)?)
}

最佳答案

现在,不要相信自动完成会插入您需要的代码——它会从“header”中插入签名,但是 block 签名与您在为 block 参数插入自己的闭包时所需的声明不同.

编写闭包的正式方法是复制大括号内的签名,添加局部参数名称并使用 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 代表 node — 但这里不是这样做的好地方,因为它使您的代码的可读性大大降低。最好保留 $0 和 friend 用于参数非常明显的闭包,例如您使用 map排序。)

参见 ClosuresThe Swift Programming Language 中进一步解释。


此外,因为 stop 是一个 UnsafeMutablePointer,所以使用它的语法与 ObjC 中的语法有点不同:set stop.memory = true 打破枚举。

关于objective-c-blocks - 如何在 SpriteKit 中使用 Swift "enumerateChildNodesWithName"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24213436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com