2016-04-30 8 views
9

ऐप्पल के दस्तावेज़ीकरण के अनुसार स्विफ्ट को प्रारंभिक के ओवरराइड की आवश्यकता नहीं है। जैसे ही हम में Foo ऐसे class Foo<T> { रूप Xcode हमें एक त्रुटि Initializer does not override a designated initializer from its superclass प्रदान करता है कुछ सामान्य जोड़ने के रूप मेंक्यों स्विफ्ट जेनेरिक सुपरक्लास के नामित प्रारंभकर्ता के ओवरराइड की आवश्यकता है?

class Foo { 
    let value: Int 
    init(value: Int = 5) { 
    self.value = value 
    } 
} 

class Bar: Foo { 
} 

: एक निम्न कोड उदाहरण में BarFoo के प्रारंभकर्ता इनहेरिट करती है। क्या कोई दस्तावेज़ीकरण या त्वरित विकास चर्चा है जो बताती है कि यह क्यों हो रहा है?


अद्यतन। ऐसा लगता है कि जेनेरिक ओवरराइड आवश्यकता के लिए एक प्रमुख कारण नहीं है।

protocol FooProtocol { 
    associatedtype T 
} 

class Foo<U>: FooProtocol { 
    typealias T = U 

    let value: Int 
    init(value: Int, otherValue: T) { 
     self.value = value 
     self.otherValue = otherValue 
    } 
} 

class Bar: Foo<Int> { 
} 

लेकिन वहाँ व्यवहार का एक और रोचक अवलोकन है: यहां बताया गया सामान्य के साथ एक वर्ग को परिभाषित करने के लिए है कि नामित प्रारंभकर्ता की ओवरराइड की आवश्यकता नहीं है एक विकल्प है। कारण ओवरराइड आवश्यकता निम्नलिखित की तरह प्रारंभकर्ता निर्धारित करना:

init(value: Int = 5) { 
    self.value = value 
} 

अजीब बात बात यह है कि इस तरह के नामित प्रारंभकर्ता कारण में इस ओवरराइड आवश्यकता निम्नलिखित गायब हो जाते हैं के रूप में एक और पैरामीटर जोड़ने:

init(value: Int = 5, otherValue: T) { 
    self.value = value 
} 

अद्यतन 2। मैं इस व्यवहार के लिए एक तार्किक व्याख्या नहीं मिल रहा है, इस बिंदु पर मैं इसे संकलक बग के रूप में रिपोर्ट - https://bugs.swift.org/browse/SR-1375

+0

मैंने कुछ और परीक्षण किया और समस्या _ डिफ़ॉल्ट मान _ प्रतीत होती है। अपने उदाहरणों में से '= 5' लें और उनमें से _none_ संकलक त्रुटि में परिणामस्वरूप। – matt

उत्तर

1

मैं वास्तव में सामान्य वर्ग से इनहेरिट लिए एक बग रिपोर्ट भरा:

enter image description here

यह वापस आ गया था में पिछले साल नवंबर और अभी तक कोई जवाब नहीं मिला, इसलिए ¯_ (ツ) _/¯

+0

धन्यवाद। यह जानना निश्चित रूप से सहायक है कि मैं अकेले इस मुद्दे का सामना नहीं कर रहा हूं। इस बीच मैं इस संदेश को एक उत्तर के रूप में नहीं मान सकता, क्योंकि यह न तो दस्तावेज और न ही इस विषय के बारे में त्वरित विकास चर्चा। –

+0

मैं सहमत हूं: बहुत रोचक, लेकिन यह एक टिप्पणी है, जवाब नहीं। – matt

1

यह स्पष्ट रूप से एक बग है। इसके अलावा, हालांकि बग एक सामान्य के उपclass द्वारा elicited, इसके निकट कारण डिफ़ॉल्ट मान है। यह ठीक संकलित:

class Foo<T> { 
    let value: Int 
    init(value: Int) { 
     self.value = value 
    } 
} 

class Bar: Foo<String> { 
} 

लेकिन यह नहीं करता है:

class Foo<T> { 
    let value: Int 
    init(value: Int = 5) { 
     self.value = value 
    } 
} 

class Bar: Foo<String> { 
} 

एक अंतर के बिना मनमाने ढंग से भेद उस तरह एक निश्चित संकेत है कि यह एक संकलक बग है।

+0

मुझे संदेह है, हालांकि निश्चित रूप से मैं साबित नहीं कर सकता कि दृश्यों के पीछे संकलक के लिए भ्रमित साबित हो रहा है कि 'मूल्य' के बिना 'init (value: int = 5)' को कॉल करने के लिए 'init' '। मुझे नहीं पता कि यह सामान्य के मामले में भ्रमित क्यों है, लेकिन यह वह दिशा है जो आपके उदाहरणों को इंगित करती है। – matt

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

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