ऐप्पल के दस्तावेज़ीकरण के अनुसार स्विफ्ट को प्रारंभिक के ओवरराइड की आवश्यकता नहीं है। जैसे ही हम में 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 {
}
: एक निम्न कोड उदाहरण में Bar
Foo
के प्रारंभकर्ता इनहेरिट करती है। क्या कोई दस्तावेज़ीकरण या त्वरित विकास चर्चा है जो बताती है कि यह क्यों हो रहा है?
अद्यतन। ऐसा लगता है कि जेनेरिक ओवरराइड आवश्यकता के लिए एक प्रमुख कारण नहीं है।
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
मैंने कुछ और परीक्षण किया और समस्या _ डिफ़ॉल्ट मान _ प्रतीत होती है। अपने उदाहरणों में से '= 5' लें और उनमें से _none_ संकलक त्रुटि में परिणामस्वरूप। – matt