2014-06-13 9 views
17

Ich verwende Swift, um ein Spiel in SpriteKit zu machen.Wie verwende ich "enumerateChildNodesWithName" mit Swift in SpriteKit?

In Objective-C konnte ich die folgende Methode verwenden:

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

, um Aktionen auf diesem *node, aber ich kann diese Funktion nicht bekommen in Swift arbeiten. Im Grunde weiß ich nicht, wie man diesen Knoten in Swift referenziert.

Dies ist der Code, den ich verwende, aber ich habe Probleme mit dem "usingBlock:" Teil. Ich habe viele Dinge für viele Stunden ausprobiert, aber es ist mir nicht gelungen. Hilfe bitte!

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)?) 
} 

Antwort

46

Vorerst nicht zum automatischen Vervollständigung vertrauen Sie den Code eingelegt werden muss - es fällt in Signaturen aus dem „Header“, sondern eine Blocksignatur ist nicht das gleiche wie die Erklärung benötigen Sie, wenn Sie Ihre eigene Schließung Einfügen für einen Blockparameter.

Der formale Weg, um eine Schließung zu schreiben wäre die Unterschrift in geschweiften Klammern zu replizieren, lokale Parameternamen hinzufügen und mit dem in Schlüsselwort des Beginn des Verschlusskörpers markieren:

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

Aber Swift Typinferenz Mittel Du musst nicht so viel schreiben. Stattdessen können Sie nur die Parameter nennen, weil ihre Art (wie auch der Rückgabetyp der Schließung) bekannt ist:

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

können Sie auch Verschluss Syntax Hinter:

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

(Sie können sogar Lassen Sie die lokalen Parameternamen fallen und beziehen Sie sich auf Parameter nach Position - zB $0 für node - aber hier ist kein großartiger Ort, um dies zu tun, weil es Ihren Code viel weniger lesbar macht.Es ist am besten, $0 und Freunde für Schließungen zu reservieren, wo es offensichtlich ist Was sind die Parameter, wie die Verschlüsse, die Sie mitverwendenund sort.)

Siehe Closures in Die Swift Programmiersprache für weitere Erklärung.


Auch, weil stop ein UnsafeMutablePointer ist, die Syntax für sich verwendet, ist ein bisschen anders als in ObjC: set stop.memory = true aus Aufzählung zu brechen.

+0

Großartig !! Es funktionierte!! Danke vielmals!!! – rv123

+2

Die Verwendung von stop.memory = true gab mir einen Fehler, also habe ich stop.withUnsafePointer {$ 0. Memory = true} verwendet, wie hier empfohlen [http://stackoverflow.com/questions/24142589/how-to-set- cmutablepointerobjcbool-to-false-in-swift) – rv123

+0

Guter Fang. Bearbeitete Antwort. – rickster