objective-c-blocks swift enumeration

objective c blocks - ¿Cómo se usa "enumerateChildNodesWithName" con Swift en SpriteKit?



objective-c-blocks enumeration (1)

Estoy usando Swift para hacer un juego en SpriteKit.

En Objective-C podría usar el siguiente método:

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

para realizar acciones en ese *node , pero no puedo hacer que esta función funcione en Swift. Básicamente, no sé cómo hacer referencia a ese nodo en Swift.

Este es el código que estoy usando, pero estoy teniendo problemas con la parte "usingBlock:". He intentado muchas cosas durante muchas horas, pero no he tenido éxito. ¡Ayuda por favor!

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


Por ahora, no confíe en la función de autocompletar para insertar el código que necesita: deja caer las firmas del "encabezado", pero una firma de bloque no es lo mismo que la declaración que necesita al insertar su propio cierre para un parámetro de bloque.

La forma formal de escribir un cierre sería replicar la firma dentro de llaves, agregar nombres de parámetros locales y usar la palabra clave in para marcar el inicio del cuerpo del cierre:

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

Pero la inferencia de tipos de Swift significa que no tienes que escribir mucho. En su lugar, puede nombrar los parámetros, ya que se conoce su tipo (así como el tipo de devolución del cierre):

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

También puede usar la sintaxis de cierre final:

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

(Incluso puede soltar los nombres de los parámetros locales y hacer referencia a los parámetros por posición, por ejemplo, $0 para el node , pero este no es un buen lugar para hacerlo porque hace que su código sea menos legible. Lo mejor es reservar $0 y amigos para cierres donde es certeramente obvio cuáles son los parámetros, como los cierres que usas con el map y el sort ).

Vea Cierres en El lenguaje de programación Swift para una explicación más detallada.

Además, como stop es un UnsafeMutablePointer , la sintaxis para usarlo es un poco diferente que en ObjC: establece stop.memory = true para salir de la enumeración.