2014-06-13 12 views
17

Używam Swift do gry w SpriteKit.Jak używać "enumerateChildNodesWithName" za pomocą Swift w SpriteKit?

w Objective-C można używać w następujący sposób:

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

do wykonywania czynności, w tym *node, ale nie mogę dostać tę funkcję pracy w Swift. Zasadniczo nie wiem, jak odwołać się do tego węzła w Swift.

To jest kod, którego używam, ale mam problem z częścią "usingBlock:". Próbowałem wielu rzeczy przez wiele godzin, ale mi się nie udało. Prosimy o pomoc!

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

Odpowiedz

46

Na razie nie ufa autouzupełnianie wstawić kod trzeba - spada w podpisach z „cel”, ale podpis blok nie jest taka sama jak w zgłoszeniu trzeba przy wstawianiu własną zamknięcie dla parametru bloku.

Formalny sposób napisać zamknięcie byłoby odtworzenie podpisu wewnątrz szelki, dodając lokalne nazwy parametrów i za pomocą słowa kluczowego in z okazji rozpoczęcia korpusu zamknięcia:

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

Ale Swifta typu środki wnioskowania nie musisz pisać tak dużo. Zamiast tego, można po prostu wymienić parametry, ponieważ ich rodzaj (a także zwracany typ zamknięcia jest) jest znana:

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

Można również użyć końcowe zamknięcie składnia:

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

(Można nawet upuść lokalnych nazw parametrów i odnoszą się do parametrów według pozycji - np $0 dla node - ale tutaj nie jest to idealne miejsce, aby to zrobić, ponieważ to sprawia, że ​​kod znacznie mniej czytelny najlepiej zarezerwować $0 i przyjaciół na zamknięciach gdzie jest oślepiająco oczywiste. jakie są parametry, takie jak zamknięcia używane z map i sort.)

Patrz: Closures w The Swift Programming Language w celu uzyskania dalszych wyjaśnień.


Ponadto, ponieważ stop jest UnsafeMutablePointer, składnia do używania jest nieco inna niż w ObjC: set stop.memory = true wyrwać się z wyliczeniem.

+0

Świetne !! Zadziałało!! Wielkie dzięki!!! – rv123

+2

Korzystanie stop.memory = true dał mi błąd, więc użyłem stop.withUnsafePointer {$ 0.memory = true}, zgodnie z zaleceniami [tutaj] (http://stackoverflow.com/questions/24142589/how-to-set- cmutablepointerobjcbool-to-false-in-swift) – rv123

+0

Dobry połów. Edytowana odpowiedź. – rickster

Powiązane problemy