2014-06-13 8 views
17

मैं स्प्राइटकिट में एक गेम बनाने के लिए स्विफ्ट का उपयोग कर रहा हूं।SpriteKit में स्विफ्ट के साथ "enumerateChildNodesWithName" का उपयोग कैसे करें?

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

कि *node पर कार्रवाई करने के लिए है, लेकिन मैं इस समारोह स्विफ्ट में काम नहीं कर प्राप्त कर सकते हैं:

ऑब्जेक्टिव-सी मैं निम्न विधि का उपयोग कर सकता है में

। असल में, मुझे नहीं पता कि स्विफ्ट में उस नोड को कैसे संदर्भित किया जाए।

यह वह कोड है जिसका मैं उपयोग कर रहा हूं, लेकिन मुझे "उपयोगब्लॉक:" भाग में समस्या हो रही है। मैंने कई घंटों तक कई चीजों की कोशिश की है, लेकिन सफल नहीं हुआ है। कृपया मदद करें!

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

उत्तर

46

अभी के लिए, कोड की जरूरत सम्मिलित करने के लिए स्वत: पूर्ण विश्वास नहीं करते हैं - यह "शीर्षक" से हस्ताक्षर में चला जाता है, लेकिन एक ब्लॉक हस्ताक्षर घोषणा की जरूरत है जब अपनी खुद की बंद डालने के समान नहीं है ब्लॉक पैरामीटर के लिए।

एक बंद लिखने के लिए ब्रेसिज़ के अंदर हस्ताक्षर को दोहराने के लिए किया जाएगा औपचारिक तरीके, स्थानीय पैरामीटर नाम जोड़ने और बंद शरीर की शुरुआत चिह्नित करने के लिए in कीवर्ड का उपयोग:

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

लेकिन स्विफ्ट का प्रकार निष्कर्ष साधन आपको इतना लिखना नहीं है। बजाय, आप बस पैरामीटर नाम कर सकते हैं, क्योंकि उनके प्रकार (और साथ ही बंद की वापसी प्रकार) जाना जाता है:

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

तुम भी पीछे चल बंद सिंटैक्स का उपयोग कर सकते हैं:

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

(तुम भी कर सकते हैं स्थानीय पैरामीटर नामों को छोड़ दें और node के लिए $0 पर पैरामीटर को संदर्भित करें - लेकिन ऐसा करने के लिए यहां कोई शानदार जगह नहीं है क्योंकि यह आपके कोड को बहुत कम पठनीय बनाता है। $0 को आरक्षित करना सबसे अच्छा है और यह बंद होने के लिए मित्र है जहां यह स्पष्ट रूप से स्पष्ट है पैरामीटर क्या हैं, जैसे किके साथ उपयोग किए जाने वाले बंदरगाहों की तरहऔर sort।)

अधिक विवरण के लिए स्विफ्ट प्रोग्रामिंग भाषा में Closures देखें।


इसके अलावा, क्योंकि stop एक UnsafeMutablePointer है, यह प्रयोग करने के लिए वाक्य रचना थोड़ा ObjC की तुलना में अलग है: गणन से बाहर तोड़ stop.memory = true निर्धारित किया है।

+0

ग्रेट !! इसने काम कर दिया!! बहुत बहुत धन्यवाद!!! – rv123

+2

stop.memory = true का उपयोग करके मुझे एक त्रुटि मिली, इसलिए मैंने स्टॉप.withUnsafePointer {$ 0.memory = true} का उपयोग किया, जैसा कि अनुशंसित [यहां] (http://stackoverflow.com/questions/24142589/how-to-set- cmutablepointerobjcbool-to-false-in-swift) – rv123

+0

अच्छी पकड़। संपादित उत्तर – rickster

संबंधित मुद्दे