Swift Academy · पाठ

क्लोज़र

क्लोज़र

पाठ 1, कुल 1 में से29 चरण

क्लोज़र, CoddyKit पर Swift Academy का एक निःशुल्क पाठ है। यह 1 में से 1वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Swift Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Swift Academy पाठ्यक्रम में कुल 1 पाठ शामिल हैं।

परिचय

नमस्कार,

क्लोज़र स्वतंत्र कोड ब्लॉक होते हैं। क्लोज़र को कोड में पैरामीटर के रूप में पास किया जा सकता है या कोड के अंदर उपयोग किया जा सकता है।

क्लोज़र एक फ़ंक्शन प्रकार होता है। कोड के भीतर पास करके इसका उपयोग किया जा सकता है। ये अन्य प्रोग्रामिंग भाषाओं के लैम्ब्डा के समान होते हैं।

मेमोरी प्रबंधन

सबसे महत्वपूर्ण बातों में से एक यह है कि क्लोज़र उस संदर्भ में नियतांक और चरों के मानों को संग्रहीत कर सकता है जिसमें उसे परिभाषित किया गया है।

इस संग्रहण को बाहरी मानों को कैप्चर करना कहा जाता है।

इस संग्रहण के दौरान स्विफ्ट हमारे लिए मेमोरी प्रबंधन करता है।

क्लोज़र के प्रकार

क्लोज़र के प्रकार होते हैं।

  1. वैश्विक फ़ंक्शन नाम वाले क्लोज़र होते हैं। ये फ़ंक्शन कोई मान संग्रहीत नहीं करते।
  2. नेस्टेड फ़ंक्शन अपने नाम और उसमें समाहित फ़ंक्शन के मानों को साथ ले जा सकते हैं।
  3. क्लोज़र एक्सप्रेशन एक अनाम क्लोज़र होता है, जो सरल सिंटैक्स के साथ अपने आसपास के संदर्भ का डेटा संग्रहीत कर सकता है।

क्लोज़र का सिंटैक्स

क्लोज़र के सिंटैक्स को यथासंभव सरल बनाने का प्रयास किया गया है। इनमें सबसे महत्वपूर्ण बातें निम्नलिखित हैं।

  • क्लोज़र में पैरामीटर का अनुमान लगाया जा सकता है।
  • रिटर्न मान का अनुमान लगाया जा सकता है।
  • एक पंक्ति में क्लोज़र से मान लौटाया जा सकता है।
  • आर्ग्युमेंट के नामों को $ 0 या $ 1 जैसे संक्षिप्त रूपों में लिखा जा सकता है।
  • अंतिम क्लोज़र सिंटैक्स का उपयोग किया जा सकता है।

जानकारी

क्लोज़र एक्सप्रेशन का अर्थ है सिंटैक्स और सरलता पर ध्यान देते हुए क्लोज़र को उसी पंक्ति में लिखना।

क्लोज़र का सिंटैक्स

नीचे दिए गए नमूना कोड में क्लोज़र का सिंटैक्स दिखाया गया है।

{ (parameters) -> return type in
    statements
}


func backward(_ s1: String, _ s2: String) -> Bool {
    return s1 > s2
}
//If we didn't use closures, our code structure would be as follows.

var reversedNames = names.sorted(by: backward)

क्लोज़र का सिंटैक्स

हालांकि, क्लोज़र के साथ हमें इस प्रकार के अनावश्यक रूप से नामित वैश्विक क्लोज़र को परिभाषित करने की आवश्यकता नहीं होती।

पैरामीटर में एक सरल क्लोज़र एक्सप्रेशन परिभाषित करना पर्याप्त है। आइए उदाहरण देखते हैं।

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})

print(reversedNames)

///sorted method takes closure as parameter.

इन कीवर्ड

इन कीवर्ड से समझ आता है कि क्लोज़र का मुख्य भाग शुरू हो गया है।

इन कीवर्ड से पहले क्लोज़र द्वारा लिए जाने वाले पैरामीटर और रिटर्न प्रकार को परिभाषित करना आवश्यक है।

संदर्भ से प्रकारों का अनुमान

ऊपर दिए गए उदाहरण में क्लोज़र एक्सप्रेशन के पैरामीटर और रिटर्न प्रकार का अनुमान लगाया जा सकता है, क्योंकि sorted विधि को क्लोज़र के रूप में पास किया जाता है।

इसलिए हमें उन्हें अलग से परिभाषित करने की आवश्यकता नहीं होती।

इस उदाहरण में, names ऐरे के मान स्ट्रिंग हैं, इसलिए यह समझा जाएगा कि क्लोज़र द्वारा लिए जाने वाले पैरामीटर स्ट्रिंग प्रकार के होंगे।

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

उदाहरण

इससे नीचे दिया गया उपयोग और सरल हो जाएगा।

रिटर्न प्रकार का अनुमान लगाए जाने पर एरो कोड से हटाया भी जा सकता है।

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})

print(reversedNames)

संक्षिप्त सिंटैक्स

कोड पढ़ने वालों को भ्रमित करने से बचने के लिए छोटे सिंटैक्स के बजाय लंबे सिंटैक्स का उपयोग करना बेहतर है।

ऊपर दिए गए सिंटैक्स को और भी छोटा किया जा सकता है।

रिटर्न कीवर्ड हटाकर क्लोज़र एक्सप्रेशन के साथ रिटर्न मान को संक्षिप्त किया जा सकता है।

/*
In this example, the return keyword has been extracted.
It already has single expression. 
There is no need to express it as an extra with return.
*/

var names = ["Coddy", "Kit"]
let reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )
print(reversedNames)

उदाहरण

इस उदाहरण में रिटर्न कीवर्ड हटा दिया गया है।

यहाँ पहले से ही एकल एक्सप्रेशन है, इसलिए उसे रिटर्न के साथ अलग से लिखने की आवश्यकता नहीं है।

reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )

नाम का संक्षिप्त रूप

सिंटैक्स को और भी छोटा किया जा सकता है। ऊपर दिए गए उदाहरण में हमने बताया था कि क्लोज़र दो पैरामीटर लेता है, जिनमें s1 और s2 शामिल हैं। उनके प्रकारों का अनुमान लगाया जाता है।

अब हम इन पैरामीटर को संक्षिप्त रूपों से लिखकर उन्हें परिभाषित करने की आवश्यकता से बच सकते हैं।

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

let names = ["Coddy", "Kit"]
let reversedNames = names.sorted(by: { $0 > $1 } )
print(reversedNames)

// In this example $0 will shortcut the first parameter and $1 will shortcut the second parameter.

उदाहरण को संक्षिप्त करना

var names = ["Coddy", "Kit"]

let reversedNames = names.sorted(by: >)
print(reversedNames)
// Greater than operator takes two parameters and the rotation type is squat.

TRAILING CLOSURE

अंतिम क्लोज़र

यदि क्लोज़र फ़ंक्शन को पास किया जाने वाला पैरामीटर फ़ंक्शन का अंतिम आर्ग्युमेंट हो और क्लोज़र एक्सप्रेशन लंबा हो, तो उसे अंतिम क्लोज़र कथन के रूप में लिखना अधिक उपयोगी हो सकता है।

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

अधिकांश iOS विधियों का अंतिम पैरामीटर क्लोज़र होता है।

अंतिम पैरामीटर

उदाहरण के लिए, इस उदाहरण में अंतिम पैरामीटर क्लोज़र है।

class Animator {
    class func animate(withDuration duration: Double, animations: () -> Void) {
        animations()
    }
}

class MyViewController {
    func start() {
        // With the traditional method, we can call this fund as follows.
        Animator.animate(withDuration: 1, animations: { [unowned self] in
            print("red")
        })
    }
}
MyViewController().start()

ऊपर दिया गया कोड कम पठनीय है, इसलिए इसे निम्नलिखित तरीके से लिखा जा सकता है

ऊपर दिया गया कोड कम पठनीय है, इसलिए इसे निम्नलिखित तरीके से लिखा जा सकता है।

import Foundation
Thread.sleep(forTimeInterval: 1)
print("Background color changed to red")

उदाहरण

अंतिम क्लोज़र सिंटैक्स का उपयोग करते समय हमें आर्ग्युमेंट लेबल लिखने की आवश्यकता नहीं होती।

क्योंकि अब क्लोज़र फ़ंक्शन कॉल का एक हिस्सा बन चुके हैं।

func someFunctionThatTakesAClosure(closure: () -> Void) {
    // function body goes here
}

// Here's how you call this function without using a trailing closure:
someFunctionThatTakesAClosure(closure: {
    // closure's body goes here
})

// Here's how you call this function with a trailing closure instead:
someFunctionThatTakesAClosure() {
    // trailing closure's body goes here
}

सिंटैक्स

हम वास्तव में अंतिम क्लोज़र सिंटैक्स को सिंटैक्स शुगर की तरह समझ सकते हैं। इससे कोड अधिक पठनीय बनता है।

/*
In the example below, animations
are expressed as closure.
*/
public class func animate(withDuration: TimeInterval, animations: () -> Void)

// In traditional usage, we need to make a call like the following.
UIView.animate(withDuration: 1, animations: { [unowned self] in
    self.view.backgroundColor = UIColor.red
})

/*
In this way, both the readability of the code
increases and we avoid the use of extra brackets.
If it is as above and the last parameter of the method 
is closure, Swift allows to make a call like the one below.
*/

UIView.animate(withDuration: 1) { [unowned self] in
    self.view.backgroundColor = UIColor.red
}

कोड का परीक्षण करने के लिए हम नीचे दिए गए कोड का उपयोग कर सकते हैं

कोड का परीक्षण करने के लिए हम नीचे दिए गए कोड का उपयोग कर सकते हैं।


func greetThenRunClosure(name: String, closure: () -> ()) {
    print("Hello, \(name)!")
    closure()
}

greetThenRunClosure(name: "Paul") {
    print("The closure was run")
}

क्लोज़र द्वारा मानों को कैप्चर करना

क्लोज़र अपने परिवेश में मौजूद चरों के मानों को रख सकता है। आप इन चरों के मानों को उसके मुख्य भाग के भीतर से बदल भी सकते हैं और उन तक पहुँच भी सकते हैं।

यह तब भी संभव है जब ये चर उस मूल दायरे में मौजूद न हों जिसमें इन्हें परिभाषित किया गया था।

नियतांक आदि

सामान्यतः कहा जाता है कि क्लोज़र एक्सप्रेशन के साथ नेस्टेड फ़ंक्शन इस डेटा को अपने पास रख सकते हैं। वे बाहरी फ़ंक्शन का डेटा संग्रहीत कर सकते हैं।

func makeIncrementer(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementer() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementer
}

let incrementByTen = makeIncrementer(forIncrement: 10)

print(incrementByTen())
// returns a value of 10
print(incrementByTen())
// returns a value of 20
print(incrementByTen())
// returns a value of 30

जारी

यदि आप किसी क्लास की प्रॉपर्टी के रूप में क्लोज़र असाइन करते हैं, तो वह इस इंस्टेंस के संदर्भों को अपने पास रखना शुरू कर देगा।

इसलिए क्लोज़र और इंस्टेंस के बीच एक मजबूत संदर्भ चक्र बन जाएगा।

मेमोरी लीक पर विशेष ध्यान दिया जाना चाहिए।

चेतावनी

क्लोज़र और फ़ंक्शन संदर्भ प्रकार होते हैं।

@escaping

क्लोज़र का अतुल्यकालिक रूप से उपयोग होने वाली कई स्थितियों में हमें इस उपयोग की आवश्यकता पड़ सकती है।

स्विफ्ट के शुरुआती संस्करणों (1 और 2) में स्विफ्ट के पैरामीटर में मौजूद क्लोज़र बाहर निकलने वाले होते थे और बाद में बाहर न निकलने वाले हो गए। यदि हमें क्लोज़र को बाहर न निकलने वाले रूप में पास करना होता, तो हमें इसे विशेष रूप से बताना पड़ता था।

बाद के संस्करणों में मेमोरी उपयोग के मामले में लाभ पाने के लिए क्लोज़र पैरामीटर को बाहर न निकलने वाला बनाया गया।

अब यदि हम किसी क्लोज़र को बाहर निकलने वाला परिभाषित करना चाहते हैं, तो हमें @escaping कीवर्ड का उपयोग करना होगा।

@ESCAPING कीवर्ड

यदि हम फ़ंक्शन के लौटने के बाद भी फ़ंक्शन को असाइन किए गए क्लोज़र को कॉल करना चाहते हैं, तो हमें उसे @escaping कीवर्ड के साथ चिह्नित करना होगा।

डिफ़ॉल्ट रूप से फ़ंक्शन में परिभाषित क्लोज़र संदर्भ प्रकार होते हैं, लेकिन वे संदर्भ गणना नहीं बढ़ाते। क्योंकि कॉल के समय इस क्लोज़र का जीवनकाल समाप्त हो जाता है और हमें संदर्भ गणना को अलग से बढ़ाने की आवश्यकता नहीं होती।

हालांकि, यदि फ़ंक्शन कॉल किए जाने के बाद हमें पैरामीटर के रूप में दिया गया क्लोज़र चाहिए, तो हमें उसे @escaping कीवर्ड के साथ व्यक्त करना पड़ सकता है।

nonEscaping

सबसे पहले देखते हैं कि nonEscaping क्लोज़र कैसे काम करता है।

जब यह क्लोज़र फ़ंक्शन में पैरामीटर के रूप में पास किया जाता है, तो फ़ंक्शन के मुख्य भाग में क्लोज़र को संसाधित किया जाता है और फिर उसे कंपाइलर को लौटा दिया जाता है।

फ़ंक्शन के लौटने के बाद, अर्थात निष्पादन पूरा होने पर, यह क्लोज़र के दायरे से बाहर हो जाता है और मेमोरी में वापस कर दिया जाता है।

बाहर निकलने वाले क्लोज़र का उपयोग

जब किसी क्लोज़र फ़ंक्शन को आर्ग्युमेंट के रूप में पास किया जाता है, तो क्लोज़र फ़ंक्शन के लौटने और निष्पादन पूरा होने के बाद भी वह बना रहता है।

यह मेमोरी में स्थान घेरता है, जब तक कि क्लोज़र निष्पादित नहीं हो जाता। बाहर निकलने वाले क्लोज़र कई प्रकार के होते हैं।

बधाई हो

बधाई हो 🎉

हम अपने पाठ के अंत तक पहुंच गए हैं। 

अगले पाठ में मिलते हैं 😎

क्लोज़र — चित्र 29
शुरुआत निःशुल्क

एआई शिक्षक के साथ Swift सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
122
पाठ
409

अक्सर पूछे जाने वाले प्रश्न

क्या “क्लोज़र” पाठ निःशुल्क है?

हाँ — Swift Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “क्लोज़र” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Swift Academy पाठ्यक्रम में कुल 1 पाठ शामिल हैं।

“क्लोज़र” में मैं क्या सीखूँगा?

क्लोज़र आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Swift Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Swift Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Swift Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 1 में से 1वाँ पाठ है।

“क्लोज़र” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Swift Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Swift Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

← Swift Academy पर वापस जाएँ