मैं स्विफ्ट के 'क्लोजर' को और अधिक सटीक रूप से समझने की कोशिश कर रहा हूं।
लेकिन @escaping
और Completion Handler
समझना बहुत मुश्किल है
मैंने कई स्विफ्ट पोस्टिंग और आधिकारिक दस्तावेजों को खोजा, लेकिन मुझे लगा कि यह अभी भी पर्याप्त नहीं है।
यह आधिकारिक दस्तावेजों का कोड उदाहरण है
var completionHandlers: [()->Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping ()->Void){
completionHandlers.append(completionHandler)
}
func someFunctionWithNoneescapingClosure(closure: ()->Void){
closure()
}
class SomeClass{
var x:Int = 10
func doSomething(){
someFunctionWithEscapingClosure {
self.x = 100
//not excute yet
}
someFunctionWithNoneescapingClosure {
x = 200
}
}
}
let instance = SomeClass()
instance.doSomething()
print(instance.x)
completionHandlers.first?()
print(instance.x)
मैंने सुना है कि उपयोग करने के दो तरीके और कारण हैं @escaping
पहला एक क्लोजर के भंडारण के लिए है, दूसरा Async ऑपरेटिंग उद्देश्यों के लिए है।
निम्नलिखित मेरे प्रश्न हैं :
सबसे पहले, यदि doSomething
निष्पादित होता है , तो someFunctionWithEscapingClosure
क्लोजर पैरामीटर के साथ निष्पादित होगा और उस क्लोजर को वैश्विक चर सरणी में सहेजा जाएगा।
मुझे लगता है कि क्लोजर है {self.x = 100}
कैसे self
{self.x = 100} जो ग्लोबल वैरिएबल में सेव है, उस ऑब्जेक्ट से completionHandlers
कनेक्ट हो सकता instance
है SomeClass
?
दूसरा, मैं someFunctionWithEscapingClosure
इस तरह से समझ रहा हूं ।
completionHandler
वैश्विक वैरिएबल 'पूराहैंडलर' के लिए स्थानीय वैरिएबल क्लोजर को स्टोर करनाwe using
भागने वाले कीवर्ड!
@escaping
कीवर्ड someFunctionWithEscapingClosure
रिटर्न के बिना , स्थानीय चर completionHandler
मेमोरी से हटा देगा
@escaping
कि स्मृति में बंद रखना है
क्या यह सही है?
अंत में, मैं सिर्फ इस व्याकरण के अस्तित्व के बारे में आश्चर्य करता हूं।
शायद यह एक बहुत ही अल्पविकसित प्रश्न है।
यदि हम कुछ विशिष्ट कार्य के बाद कुछ कार्य निष्पादित करना चाहते हैं। एक विशिष्ट फ़ंक्शन कॉल के बाद हम केवल कुछ फ़ंक्शन को क्यों नहीं कहते हैं?
उपरोक्त पैटर्न का उपयोग करने और एक पलायन कॉलबैक फ़ंक्शन का उपयोग करने के बीच क्या अंतर हैं?