2014-12-05 80 views
1

這裏是a link到斯威夫特的教程。 在部分初始化 - 覆蓋失敗​​的初始化程序 請注意,如果使用非破壞的子類初始化程序覆蓋失敗的超類初始化程序,則子類初始化程序不能委派給超類初始化程序。重寫一個Failable初始值設定爲雨燕

但下面的例子:

class Document { 
    var name: String? 
    // this initializer creates a document with a nil name value 
    init() {} 
    // this initializer creates a document with a non-empty name value 
    init?(name: String) { 
     if name.isEmpty { return nil } 
     self.name = name 
    } 
} 

和:

class AutomaticallyNamedDocument: Document { 
    override init() { 
     super.init() 
     self.name = "[Untitled]" 
    } 
    // This is nonfailable override superclass's failable 
    override init(name: String) { 
     // Why subclass initializer still can delegate up to the superclass initializer?? 
     super.init() 
     if name.isEmpty { 
     self.name = "[Untitled]" 
     } else { 
     self.name = name 
     } 
    } 
} 

子類初始化不能委派到超初始化 爲什麼子類的初始化仍然可以委派到超初始化?

+0

添加到@Nate庫克的回答,你的'覆蓋的init(名稱:字符串)'應該叫'super.init(名稱:名稱)'爲了完成_「來推翻failable超初始化與nonfailable子類初始化」 _ ,這應該會給你一個編譯器錯誤。 – 2016-06-29 00:49:26

回答

4

這段代碼意味着您不能將代碼重置爲替代的可失敗初始化程序。注意此較早通道:

類,結構,或枚舉可以跨到另一failable初始化來自同一類,結構,或枚舉委派的failable初始化。同樣,一個子類failable初始化器可以委託給一個超類failable初始化器。

在這兩種情況下,如果委託導致初始化失敗的另一個初始化,整個初始化過程立即失敗,並且不再執行進一步的初始化代碼。

這應該說清楚爲什麼你不能委託給重寫failable初始化 - 是它實際上失敗,整個初始化過程會失敗,但你在 failable初始化的中間是。

就你而言,你委託給超類的一個非易失性構造器(super.init()),所以沒有問題。

+1

哦,我看到的,所以我委託了超類的init(){}這個 而不是初始化?(名稱:字符串)這樣對不對? – 2014-12-05 07:25:28