2014-06-13 15 views
17

SpriteKit'te oyun oynamak için Swift kullanıyorum.SpriteKit'te Swift ile "enumerateChildNodesWithName" nasıl kullanılır?

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

o *node eylemleri gerçekleştirmek için, ama Swift çalışan bu işlevi alınamıyor: Objective-C aşağıdaki yöntemi kullanabilirsiniz yılında

. Temel olarak, Swift'deki bu düğüme nasıl başvurduğumu bilmiyorum.

Kullandığım kod bu, ama "usingBlock:" bölümü ile sorun yaşıyorum. Birçok saat boyunca birçok şey denedim, ama başaramadım. Yardım lütfen!

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

cevap

46

Şimdilik, gereken kodu eklemek için otomatik tamamlama güvenmiyorum - bu "başlık" dan imzalar arasında düşer, ama bir blok imza Kendi kapatma eklerken ihtiyacınız beyanı ile aynı değildir bir blok parametresi için.

parantez içindeki imzayı çoğaltmak için olacak bir kapatma yazmak için resmi yolu, yerel parametre adları ekleme ve kapatma gövdesinin başlangıcını işaretlemek için in anahtar kelimeyi kullanarak:

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

Ama Swift'in tür kesmesi araçları o kadar yazmak zorunda değilsin. Hatta can (

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

: kendi türü (yanı sıra kapatma dönüş tipi) bilindiğinden Bunun yerine, sadece, parametreleri adlandırabilirsiniz:

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

Ayrıca kapatma sözdizimi sondaki kullanabilirsiniz yerel parametre adlarını bırakın ve parametrelere göre konumlandırın - node için $0 - ancak kodunuzu daha az okunabilir hale getirdiğinden, bunu yapmak için harika bir yer değil. $0 ve arkadaşlarınızın açık olduğu kapalı yerler için en iyisiile kullandığınız kapaklar gibi parametreler nelerdirve sort.)

fazla açıklama için Swift Programlama Dili içinde Closures bakınız. Ayrıca


, stop bir UnsafeMutablePointer çünkü bunu kullanarak sözdizimi objc daha farklı biraz: numaralandırma patlak stop.memory = true ayarlayın.

+0

Harika! İşe yaradı!! Çok teşekkürler!!! – rv123

+2

stop.memory = true kullanımı bana bir hata verdi, bu yüzden tavsiye edilen [burada] stop.withUnsafePointer {$ 0.memory = true} kullanılır (http://stackoverflow.com/questions/24142589/how-to-set- cmutablepointerobjcbool-to-false-in-hızlı) – rv123

+0

İyi yakalama. Düzenlenmiş cevap. – rickster