[英]How to use “enumerateChildNodesWithName” with Swift in SpriteKit?
我正在使用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)?)
}
目前,不要相信自動完成功能會插入所需的代碼-它會從“標頭”中刪除簽名,但是塊簽名與為塊參數插入自己的閉包時所需的聲明不同。
編寫閉包的正式方法是在括號內復制簽名,添加局部參數名稱,並使用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
}
(您甚至可以刪除本地參數名稱,並按位置引用參數,例如, node
為$0
,但這並不是一個好地方,因為這樣做會使代碼的可讀性大大降低。最好保留$0
和朋友用於閉包參數是什么,這真是令人眼花obvious亂,例如與map
和sort
一起使用的閉包。)
有關更多說明,請參見Swift編程語言中的 閉包 。
另外,因為stop
是UnsafeMutablePointer
,所以使用它的語法與UnsafeMutablePointer
中的語法有些不同:set stop.memory = true
可以中斷枚舉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.