मैट न्यूबर्ग द्वारा iOS 13 प्रोग्रामिंग फंडामेंटल्स विद स्विफ्ट में मुझे इस अजीब सा कोड का पता चला

class MyClass {
    var s = ""
    func store(_ s:String) {
        self.s = s
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        let m = MyClass()
        let f = MyClass.store(m) // what just happened!?
        f("howdy")
        print(m.s) // howdy
    }

}

स्पष्ट रूप से f का प्रकार () -> () है (जो कम से कम डीबगर पर कहता है) और फिर भी अगली पंक्ति पर हम इसे एक स्ट्रिंग पास कर रहे हैं।

परिणाम के आधार पर ऐसा लगता है कि f किसी भी तरह स्टोर विधि का संदर्भ बन गया है, यही कारण है कि जब m.s मुद्रित होता है तो आपको "हाउडी" मिलता है। लेकिन यह कोड वास्तव में मुझे चकित करता है और जो हो रहा है उसकी एक व्याख्या की बहुत सराहना की जाएगी।

मैं यह भी नहीं समझता कि MyClass.store कानूनी कैसे है क्योंकि store एक इंस्टेंस विधि है और इस मामले में इसे एक स्थिर विधि के रूप में संदर्भित किया जा रहा है।

0
Matt Mclaughlin 4 मार्च 2020, 23:42
मैंने इसे पहले नहीं देखा है लेकिन आप एक चर के लिए एक फ़ंक्शन असाइन करते हैं और आप यह भी कहते हैं कि फ़ंक्शन (क्योंकि यह एक इंस्टेंस फ़ंक्शन है) को किस उदाहरण पर निष्पादित किया जाना चाहिए। तो 'एम' MyClass का एक उदाहरण है और f m पर store फ़ंक्शन को निष्पादित करने के लिए एक चर है। और ध्यान दें कि MyClass.store का पूरा सिंटैक्स MyClass.store(self: MyClass). In the same way your view controller has ViewController.viewDidLoad(self: ViewController)` है
 – 
Joakim Danielson
4 मार्च 2020, 23:57
लेकिन शायद @matt यहां हमारी मदद कर सकता है :)
 – 
Joakim Danielson
5 मार्च 2020, 00:09

2 जवाब

पुस्तक के अगले शब्द आपको उत्तर बताते हैं:

इसका कारण यह है कि एक इंस्टेंस विधि वास्तव में दो कार्यों से बना एक करीबी स्थिर/वर्ग विधि है - एक फ़ंक्शन जो एक उदाहरण लेता है, और दूसरा फ़ंक्शन जो इंस्टेंस विधि के पैरामीटर लेता है। उस कोड के बाद, f उन कार्यों का दूसरा है, और इसे उदाहरण के store विधि के पैरामीटर को पारित करने के तरीके के रूप में कहा जा सकता है m.

3
matt 5 मार्च 2020, 01:34
ओह समझा। क्षमा करें, मैंने इस प्रश्न में जो कहा था, उसके बावजूद मैंने इसे एक्सकोड परियोजनाओं में पुस्तक नहीं देखा (मैं उन्हें अग्रानुक्रम में उपयोग करता हूं)। मैं अगली बार प्रश्न पूछने से पहले अध्याय समाप्त करूँगा।
 – 
Matt Mclaughlin
5 मार्च 2020, 20:43
हां, कोड "सिर्फ कोड" है। यह किताब में वर्णन के साथ जाने का इरादा है! कभी-कभी यह पुस्तक के बिना उपयोगी होता है, और कभी-कभी कुछ कोड भी होंगे जो इसे पुस्तक में नहीं बनाते हैं (मैं आमतौर पर इसे कॉल करता हूं, हालांकि शायद हमेशा नहीं), लेकिन सामान्य तौर पर इसका मतलब केवल चलने योग्य संस्करण होना है यह किताब में क्या कहता है। किताब सिखाती है; कोड आपको इसे अपने लिए आज़माने देता है।
 – 
matt
5 मार्च 2020, 21:09

स्विफ्ट में किसी भी इंस्टेंस मेथड को स्टेटिकली भी कहा जा सकता है, लेकिन अगर आप ऐसा करते हैं तो आपको इसे ऑपरेट करने के लिए एक इंस्टेंस पास करना होगा। तो, उदाहरण के लिए, आप इस तरह की सरणी को सॉर्ट करना चुन सकते हैं:

let sortedArray = Array.sort([13, 8, 21, 3, 1, 34, 5, 1, 2])

इसलिए, जबकि इंस्टेंस विधि को store(_ s: String) के रूप में परिभाषित किया गया है, संकलक भी विधि का एक स्थिर संस्करण बना रहा है जो कि static func store(_ self: MyClass) -> ((String)->()) जैसा है। मुझे यकीन नहीं है कि डीबगर आपको क्यों बताएगा कि f ()->() है - जो कि Xcode हिजिंक और शीनिगन्स जैसा लगता है।

हालांकि, स्विफ्ट की इस संपत्ति के कुछ बहुत अच्छे उपयोग हैं। देखें https://www.swiftbysundell.com/articles/first-class -फ़ंक्शंस-इन-स्विफ्ट

2
Stuart Sharpe 5 मार्च 2020, 01:25