2014-09-21 4 views
7

मुझे एक समस्या को समझने में कठिनाई हो रही है। सरलीकृत करने के लिए, मैं UIView विधि का उपयोग करूंगा। असल में, अगर मैं विधिस्विफ्ट पूर्णता ब्लॉक

UIView.animateWithDuration(1, animations: {() in 
     }, completion:{(Bool) in 
      println("test") 
    }) 

बारे में यह ठीक काम करता है। अब, मैं एक ही विधि, लेकिन इतना इस तरह की स्ट्रिंग बनाने करते हैं:

UIView.animateWithDuration(1, animations: {() in 
     }, completion:{(Bool) in 
      String(23) 
    }) 

यह कार्य करना बंद कर। कंपाइलर त्रुटि: कॉल में पैरामीटर 'देरी' के लिए गुम तर्क

अब, यह अजीब हिस्सा है। अगर मैं एक है कि विफल रहता है के रूप में ठीक उसी कोड है, लेकिन सिर्फ इसलिए की तरह एक प्रिंट आदेश जोड़ें:

UIView.animateWithDuration(1, animations: {() in 
     }, completion:{(Bool) in 
      String(23) 
      println("test") 
    }) 

इसे फिर से काम करने के लिए शुरू होता है।

मेरी समस्या मूल रूप से वही बात है। मेरा कोड:

downloadImage(filePath, url: url) {() -> Void in 
     self.delegate?.imageDownloader(self, posterPath: posterPath) 
     } 

काम नहीं करता है। लेकिन अगर मैं बदल जाता हूं।

downloadImage(filePath, url: url) {() -> Void in 
      self.delegate?.imageDownloader(self, posterPath: posterPath) 
       println("test") 
      } 

या यहाँ तक कि:

downloadImage(filePath, url: url) {() -> Void in 
      self.delegate?.imageDownloader(self, posterPath: posterPath) 
      self.delegate?.imageDownloader(self, posterPath: posterPath) 
      } 

यह ठीक काम करता है। मुझे समझ में नहीं आ रहा है कि यह क्यों हो रहा है। मैं स्वीकार करने के करीब हूं कि यह एक कंपाइलर बग है। जब वे केवल एक एकल अभिव्यक्ति के बने होते हैं स्विफ्ट में

उत्तर

10

क्लोजर implicit returns है। यह इस जैसे संक्षिप्त कोड के लिए अनुमति देते हैं:

reversed = sorted(names, { s1, s2 in s1 > s2 }) 

आपके मामले में, जब आप अपने स्ट्रिंग बनाने के लिए:

UIView.animateWithDuration(1, animations: {() in }, completion:{(Bool) in 
    String(23) 
}) 

आप अंत कि स्ट्रिंग लौटने और है कि अपने बंद के हस्ताक्षर बनाता है:

(Bool) -> String 

नहीं रह गया है से मेल खाता है यही कारण है कि animateWithDuration के हस्ताक्षर (जो स्विफ्ट की गुप्त Missing argument for parameter 'delay' in call त्रुटि के लिए अनुवाद क्योंकि यह फाई नहीं कर सकते हैं के लिए आवश्यक है मैच के लिए एक उपयुक्त हस्ताक्षर)।

UIView.animateWithDuration(1, animations: {() in}, completion:{(Bool) in 
    String(23) 
    return 
}) 

कौन सा अपने हस्ताक्षर बनाता है यह क्या होना चाहिए:

(Bool) ->() 

आपकी आखिरी उदाहरण:

एक आसान ठीक अपने बंद करने के अंत में एक खाली वापसी कथन को जोड़ने के लिए है

downloadImage(filePath, url: url) {() -> Void in 
    self.delegate?.imageDownloader(self, posterPath: posterPath) 
    self.delegate?.imageDownloader(self, posterPath: posterPath) 
} 

काम करता है क्योंकि वहां दो अभिव्यक्तियां हैं, केवल एक ही नहीं; निहित रिटर्न केवल तब होता है जब बंद होने में एक अभिव्यक्ति होती है। तो, यह बंद कुछ भी वापस नहीं कर रहा है और जो इसके हस्ताक्षर से मेल खाता है।

+0

धन्यवाद। लेकिन अगर मैं स्ट्रिंग (23) जोड़ता हूं और उसी पंक्ति को दोबारा कॉपी करता हूं तो स्ट्रिंग (23); स्ट्रिंग (23); ? – Wak

+0

मैं वास्तव में जवाब में स्पष्ट करने के बीच में था। संपादन देखें। –

+0

इस उत्तर के लिए धन्यवाद; मुझे यह समझने में मदद मिली कि मुझे एक अजीब क्यों मिला "एनिमेट नहीं कर सकता" विथडिशन 'प्रकार की तर्क सूची ... "त्रुटि। फिक्स आउट ठीक वही था। – SonarJetLens

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