मैं स्विफ्ट के 'क्लोजर' को और अधिक सटीक रूप से समझने की कोशिश कर रहा हूं।
लेकिन @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 कि स्मृति में बंद रखना है
क्या यह सही है?
अंत में, मैं सिर्फ इस व्याकरण के अस्तित्व के बारे में आश्चर्य करता हूं।
शायद यह एक बहुत ही अल्पविकसित प्रश्न है।
यदि हम कुछ विशिष्ट कार्य के बाद कुछ कार्य निष्पादित करना चाहते हैं। एक विशिष्ट फ़ंक्शन कॉल के बाद हम केवल कुछ फ़ंक्शन को क्यों नहीं कहते हैं?
उपरोक्त पैटर्न का उपयोग करने और एक पलायन कॉलबैक फ़ंक्शन का उपयोग करने के बीच क्या अंतर हैं?
