एस्केपिंग क्लोज़र
ऐसे क्लोज़र संग्रहीत कीजिए जो अपने फ़ंक्शन से अधिक समय तक जीवित रहें।
एस्केपिंग क्लोज़र, CoddyKit पर Swift Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Swift Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Swift Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
Escaping बनाम non-escaping
डिफ़ॉल्ट रूप से closure पैरामीटर non-escaping होता है: फ़ंक्शन के लौटने से पहले उसे कॉल करना आवश्यक है। यदि उसे बाद में संग्रहीत करके कॉल किया जा सकता है, तो उसे @escaping से चिह्नित करें।
एक non-escaping closure
यह closure समकालिक रूप से चलता है और फ़ंक्शन के लौटते ही समाप्त हो जाता है:
func run(_ work: () -> Void) {
work()
}
run { print("done now") } // "done now"@escaping क्यों आवश्यक है
बाद में उपयोग के लिए closure को संग्रहीत करने पर @escaping आवश्यक है:
var handlers: [() -> Void] = []
func register(_ handler: @escaping () -> Void) {
handlers.append(handler) // escapes the function
}
register { print("later") }
handlers[0]() // "later"असमकालिक कार्य के साथ escaping
Completion handlers escaping होते हैं, क्योंकि वे फ़ंक्शन के लौटने के बाद चलते हैं:
func load(then completion: @escaping (String) -> Void) {
// imagine async work
completion("data")
}
load { result in print(result) } // "data"self को स्पष्ट रूप से लिखना आवश्यक है
Escaping closure के भीतर instance सदस्यों तक पहुँचते समय आपको self. स्पष्ट रूप से लिखना होता है — यह याद दिलाता है कि closure self को बनाए रख सकता है।
Escaping में स्पष्ट self
कंपाइलर स्पष्ट संदर्भ की माँग करता है:
class Loader {
var name = "L"
func start(_ done: @escaping () -> Void) {
let cb = { print(self.name); done() }
cb()
}
}
Loader().start { print("finished") } // "L" then "finished"कई कॉलबैक संग्रहीत करना
Escaping closures से आप observer सूचियाँ बना सकते हैं:
class Emitter {
private var listeners: [(Int) -> Void] = []
func on(_ l: @escaping (Int) -> Void) { listeners.append(l) }
func fire(_ v: Int) { listeners.forEach { $0(v) } }
}
let e = Emitter()
e.on { print("got \($0)") }
e.fire(7) // "got 7"संग्रहीत closure लौटाना
Properties में रखे गए closures escaping होते हैं:
class Button {
var action: (() -> Void)?
func setAction(_ a: @escaping () -> Void) { action = a }
}
let b = Button()
b.setAction { print("tapped") }
b.action?() // "tapped"वैकल्पिक closures escaping होते हैं
वैकल्पिक closure पैरामीटर अप्रत्यक्ष रूप से escaping होता है (इसे Optional में लपेटा जाता है), इसलिए इसे संग्रहीत किया जा सकता है:
func maybe(_ f: (() -> Void)?) {
f?()
}
maybe { print("ran") } // "ran"कार्य-सरणी में escaping
स्थगित कार्यों की कतार escaping के उपयोग का एक पारंपरिक उदाहरण है — प्रत्येक closure को संग्रहीत किया जाता है और फिर बाद में चलाया जाता है:
var tasks: [() -> Int] = []
func schedule(_ task: @escaping () -> Int) {
tasks.append(task)
}
schedule { 1 + 1 }
schedule { 10 * 2 }
print(tasks.map { $0() }) // [2, 20]प्रदर्शन संबंधी टिप्पणी
Non-escaping closures को अधिक आक्रामक ढंग से अनुकूलित किया जा सकता है (हीप आवंटन की आवश्यकता नहीं होती)। जब संभव हो closures को non-escaping रखें; केवल तभी escaping करें जब आपको वास्तव में उन्हें संग्रहीत या स्थगित करना हो।
func sum(_ xs: [Int], _ f: (Int) -> Int) -> Int {
xs.reduce(0) { $0 + f($1) } // non-escaping, fast
}
print(sum([1, 2, 3]) { $0 * $0 }) // 14त्वरित जाँच
Closure पैरामीटर को @escaping से कब चिह्नित करना आवश्यक है?
पुनरावलोकन
आपने escaping closures सीखे:
- Non-escaping डिफ़ॉल्ट होता है; closures फ़ंक्शन के लौटने से पहले चलते हैं
- Closure को संग्रहीत या स्थगित करने के लिए
@escapingआवश्यक है - Escaping closures में
self.तक स्पष्ट पहुँच आवश्यक होती है - वैकल्पिक closure पैरामीटर अप्रत्यक्ष रूप से escaping होते हैं; गति के लिए non-escaping को प्राथमिकता दें
अगला विषय: कैप्चर सूचियाँ और weak self।
एआई शिक्षक के साथ Swift सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 122
- पाठ
- 409
अक्सर पूछे जाने वाले प्रश्न
क्या “एस्केपिंग क्लोज़र” पाठ निःशुल्क है?
हाँ — Swift Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “एस्केपिंग क्लोज़र” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Swift Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“एस्केपिंग क्लोज़र” में मैं क्या सीखूँगा?
ऐसे क्लोज़र संग्रहीत कीजिए जो अपने फ़ंक्शन से अधिक समय तक जीवित रहें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Swift Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Swift Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Swift Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“एस्केपिंग क्लोज़र” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Swift Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Swift Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।