2016-06-09 8 views
5

मैं, निम्नलिखित, काल्पनिक को समझने के लिए कोशिश कर रहा हूँ उदाहरण:किसी वर्ग को एक अनुपलब्ध inititalizer क्यों प्रदान नहीं करना है यदि यह एक प्रोटोकॉल लागू करता है जो एक घोषित करता है?

protocol MyProtocol { 
    init?(string: String) 
} 

class MyObject: MyProtocol { 
    let s: String 
    required init(string: String) { 
    self.s = string 
    } 
} 

let o = MyObject(string: "test") 
print(o.s) 

MyProtocol वाणी एक failable initializerMyObjectMyProtocol के अनुरूप है और उदाहरण कोड संकलित और बिना किसी समस्या के निष्पादित करता है।

मेरा प्रश्न है: क्यों नहीं है MyObject (के रूप में प्रति MyProtocol) एक failable प्रारंभकर्ता प्रदान करने के लिए है? (अर्थात लिए प्रतिस्थापित किया जा) init?

class A { 
    init?(s:String) {} 
    init() {} 
} 
class B : A { 
    override init(s:String) {super.init()} 
} 

init ओवरराइड कर सकते हैं:

+2

अविश्वसनीय initialiser अभी भी एक initialiser कि एक रिटर्न है। आदर्श मामले में 'मायऑब्जेक्ट'। यह एक ही हस्ताक्षर के असफल असफल प्रारंभकर्ता द्वारा trumped है। कोड को संकलित करने के लिए आपको अभी भी उसी हस्ताक्षर के साथ प्रारंभकर्ता प्रदान करना होगा। मुझे लगता है कि यह एक प्रारंभिक प्रारंभिक है जो असफल नहीं हो सकता है। एक तरीके से। – Fogmeister

+1

शायद क्योंकि विकल्प वैकल्पिक हैं? हाहा लेकिन एक गंभीर टिप्पणी पर एक अंतर्निहित वस्तु जो हमेशा 'कुछ' आपके प्रोटोकॉल को संतुष्ट करेगी। – NSGangster

उत्तर

6

यह वही कारण है कि यह संकलित के लिए है।

भी देखें docs (जब कुछ इतनी स्पष्ट रूप से प्रलेखित किया गया है, यह पूछने के लिए "क्यों" मूर्खतापूर्ण लगता है, यह भाषा के बारे में सिर्फ एक सच्चाई है):

एक failable प्रारंभकर्ता आवश्यकता एक failable से संतुष्ट किया जा सकता है या एक अनुरूप प्रकार पर अनुपलब्ध प्रारंभकर्ता।

(जैसा कि प्रश्न पर और जवाब पर टिप्पणी में कहा, इस आदर्श समझ में आता है अगर आप एक init? कि कभी नहीं होता है विफल और एक ही हस्ताक्षर के साथ एक init के बीच अंतर के बारे में सोचना - अर्थात्, वहाँ कोई प्रभावी अंतर नहीं है दूसरे शब्दों में कहें करने के लिए:। आप मुझे बता सकते हैं कि मैं विफल हो सकता है, लेकिन क्या आप मुझे बता नहीं सकता कि मैं विफल करना होगा)

+0

जब आपके पास बी का उदाहरण है * * * init के लिए एक कार्यान्वयन है?()। यह मेरे मामले में सच नहीं है क्योंकि MyObject MyProtocol के Failable प्रारंभकर्ता के लिए कार्यान्वयन प्रदान नहीं करता है। – RobertJoseph

+3

ऐसा इसलिए है क्योंकि एक प्रारंभकर्ता जो कि उपलब्ध है, को 'शून्य' या 'गैर-शून्य' वस्तु वापस करने की आवश्यकता है। चूंकि एक अनुपलब्ध प्रारंभकर्ता हमेशा एक 'गैर-शून्य' ऑब्जेक्ट देता है, यह उसके प्रोटोकॉल को संतुष्ट करता है और इसका अर्थ केवल समझ में आता है। – NSGangster

+1

@NSGangster बहुत अच्छी तरह से डाल दिया। @RobertJoseph, इसे देखने का एक और तरीका यहां है: कल्पना कीजिए कि आपने 'init?' को लागू किया था, लेकिन, वास्तव में, आपके कार्यान्वयन _never_ वापस 'शून्य' लौटा। जाहिर है, _that_ आवश्यकता को पूरा करेगा। खैर, 'init' को लागू करना उतना ही है। – matt

संबंधित मुद्दे

 संबंधित मुद्दे