स्विफ्ट दस्तावेज कहता है,

"आप एक असफल प्रारंभकर्ता को एक असफल प्रारंभकर्ता के साथ ओवरराइड कर सकते हैं लेकिन दूसरी तरफ नहीं।"

क्या कोई समझा सकता है कि एक असफल प्रारंभकर्ता को असफल प्रारंभकर्ता द्वारा ओवरराइड क्यों नहीं किया जा सकता है?

-1
rustylepord 5 सितंबर 2019, 14:37

1 उत्तर

सबसे बढ़िया उत्तर

एक असफल प्रारंभकर्ता एक वैकल्पिक मान देता है। यदि आप इसे एक गैर-असफल प्रारंभकर्ता के साथ ओवरराइड करते हैं, तो आप एक गैर-वैकल्पिक मान लौटा रहे हैं और संकलक इसे वैकल्पिक में लपेटता है। दूसरी तरफ काम नहीं करता है। जब आपका ओवर्रिडेन इनिशियलाइज़र nil लौटाता है, तो कंपाइलर को क्या करना चाहिए? यह उस प्रारंभकर्ता में कैसे मैप करता है जो वैकल्पिक नहीं लौटाता है?


मैं इस धारणा के तहत था कि जब आप एक असफल प्रारंभकर्ता को एक असफल प्रारंभकर्ता के साथ ओवरराइड करते हैं तो लौटाया गया मान गैर वैकल्पिक होता है, इसलिए इसका कोई मतलब नहीं था।

यदि आप ओवरराइडिंग क्लास पर init को कॉल करते हैं, तो यह एक गैर-वैकल्पिक लौटाता है। वैकल्पिक रिटर्न देखने के लिए, आपको स्विफ्ट को बेस क्लास पर init कॉल करने के लिए छल करना होगा।

आप उसे कैसे करते हैं? यहाँ एक तरीका है:

class Foo {
    var x: Int

    required init?() {
        x = 4
    }
 }

class Bar : Foo {
     // required includes override automatically
     required init() {
        super.init()!
        x = 5
    }
 }

let bar1 = (Bar.self).init()    // this is equivalent to Bar()
let bar2 = (Bar.self as Foo.Type).init()
print(type(of: bar1))   // Bar
print(type(of: bar2))   // Optional<Foo>
print(type(of: bar2!))  // Bar
print(bar1.x)           // 5
print(bar2!.x)          // 5

सूचना: (Bar.self as Foo.Type).init() ने एक वैकल्पिक लौटाया, भले ही इसे गैर-विफल Bar प्रारंभकर्ता के साथ बनाया गया हो।

नोट: मुझे यह काम करने के लिए required जोड़ना पड़ा, और required एक स्वचालित override है। यदि आप Foo के init को गैर-असफल और Bar के init को विफल करने योग्य बनाते हैं, तो आपको त्रुटि संदेश दिखाई देगा असफल प्रारंभकर्ता 'init ()' एक गैर-विफल प्रारंभकर्ता को ओवरराइड नहीं कर सकता

2
vacawama 5 सितंबर 2019, 13:00