2014-06-13 6 views
17

Sto usando Swift per creare un gioco in SpriteKit.Come utilizzare "enumerateChildNodesWithName" con Swift in SpriteKit?

in Objective-C ho potuto utilizzare il seguente metodo:

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

per eseguire azioni su quel *node, ma non riesco a ottenere questa funzione lavora a Swift. Fondamentalmente, non so come fare riferimento a quel nodo in Swift.

Questo è il codice che sto utilizzando, ma ho problemi con la parte "usingBlock:". Ho provato molte cose per molte ore, ma non ci sono riuscito. Aiuto per favore!

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

risposta

46

Per ora, non mi fido di completamento automatico per inserire il codice necessario - si scende nelle firme dal "colpo di testa", ma una firma blocco non è lo stesso che la dichiarazione è necessario quando si inserisce la propria chiusura per un parametro di blocco.

Il modo formale di scrivere una chiusura sarebbe quello di replicare la firma all'interno delle parentesi, aggiungendo i nomi dei parametri locali e utilizzando la parola chiave in per segnare l'inizio del corpo di chiusura:

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

ma il tipo di mezzo di inferenza di Swift non devi scrivere così tanto. Invece, si può semplicemente chiamare i parametri, perché il loro tipo (così come tipo di ritorno della chiusura) è noto:

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

È inoltre possibile utilizzare trailing sintassi di chiusura:

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

(È anche possibile rilascia i nomi dei parametri locali e fai riferimento ai parametri per posizione - ad esempio $0 per node - ma qui non è un ottimo posto per farlo perché rende il tuo codice molto meno leggibile.E 'meglio prenotare $0 e gli amici per chiusure dove è evidentemente ovvio quali sono i parametri, come le chiusure che usi con map e sort.)

Vedi Closures in La Swift Programming Language per ulteriori spiegazioni.


Inoltre, poiché stop è un UnsafeMutablePointer, la sintassi per il suo utilizzo è un po 'diverso in objC: impostato stop.memory = true di uscire censimento.

+0

Grande !! Ha funzionato!! Molte grazie!!! – rv123

+2

Utilizzare stop.memory = true mi ha dato un errore, quindi ho usato stop.withUnsafePointer {$ 0.memory = true}, come consigliato [qui] (http://stackoverflow.com/questions/24142589/how-to-set- cmutablepointerobjcbool-to-false-in-swift) – rv123

+0

Buona presa. Risposta modificata – rickster