簡體   English   中英

如何在SpriteKit中的Swift中使用“ enumerateChildNodesWithName”?

[英]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亂,例如與mapsort一起使用的閉包。)

有關更多說明,請參見Swift編程語言 閉包


另外,因為stopUnsafeMutablePointer ,所以使用它的語法與UnsafeMutablePointer中的語法有些不同:set stop.memory = true可以中斷枚舉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM