歡迎加入QQ討論群258996829
hongyin 頭像
蘋果0袋
0
hongyin

求助:failable initializer 'init(name:)' cannot override a non-failable initializer

發(fā)布時間:2015-10-08 10:51  回復:13  查看:20111   最后回復:2015-10-10 11:16  
各位,有誰知道 failable initializer 'init(name:)' cannot override a non-failable initializer,這句背后的道理的嗎?最好詳細一些。  
一葉知秋 頭像
蘋果2袋
2
一葉知秋   2015-10-08 11:13
怎么產生這個錯誤的呀。
一葉知秋 頭像
蘋果2袋
2
一葉知秋   2015-10-08 11:27
字面上看是重寫init方法時出錯
hongyin 頭像
蘋果0袋
0
hongyin   2015-10-08 14:32

是的是重寫init方法時出錯,我就是想知道 failable initializer  為什么不能用 non-bailable initializer來重寫。例子:

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) {

        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(name:name)

        if name.isEmpty { return nil }

    }

}


出錯在override init?(name: String) 一行。


error: failable initializer 'init(name:)' cannot override a non-failable initializer

    override init?(name: String) {

             ^

/var/folders/mh/10bq32_x1rg7dwzkycm931q80000gn/T/./lldb/4797/playground29.swift:15:5: note: non-failable initializer 'init(name:)' overridden here

    init(name: String) {

    ^

為啥不能重寫呢?我想知道背后的原因。



贏了現在輸了未來 頭像
蘋果2袋
2
贏了現在輸了未來   2015-10-08 16:36

把init后的?號去掉

override init(name: String) {

    super.init(name:name)

    if name.isEmpty { return nil }

}

hongyin 頭像
蘋果0袋
0
hongyin   2015-10-08 16:50
@贏了現在輸了未來

把init后的?號去掉

override init(name: String) {

    super.init(name:name)

    if name.isEmpty { return nil }

}

嗯,是的,但是我想知道為什么有這個限制呢?
贏了現在輸了未來 頭像
蘋果2袋
2
贏了現在輸了未來   2015-10-08 16:55
@hongyin
@贏了現在輸了未來

把init后的?號去掉

override init(name: String) {

    super.init(name:name)

    if name.isEmpty { return nil }

}

嗯,是的,但是我想知道為什么有這個限制呢?

是重寫的話,應該是要和父類的方法完全一致,否則怎么叫重寫呢。

hongyin 頭像
蘋果0袋
0
hongyin   2015-10-08 16:59
如果 父類的 

init(name: String) {...}

變成 

init?(name: String) { ... }

子類重寫成

init(name: String) {...}

就可以,為什么反過來就不行了呢?


贏了現在輸了未來 頭像
蘋果2袋
2
贏了現在輸了未來   2015-10-08 17:05
@hongyin
如果 父類的 

init(name: String) {...}

變成 

init?(name: String) { ... }

子類重寫成

init(name: String) {...}

就可以,為什么反過來就不行了呢?


這樣啊,值得深思。
hongyin 頭像
蘋果0袋
0
hongyin   2015-10-08 17:06
@贏了現在輸了未來
@hongyin
如果 父類的 

init(name: String) {...}

變成 

init?(name: String) { ... }

子類重寫成

init(name: String) {...}

就可以,為什么反過來就不行了呢?


這樣啊,值得深思。

是的,所以我很郁悶呢。我的QQ : 26743552 ,可以加一個嗎,討論一下。

贏了現在輸了未來 頭像
蘋果2袋
2
贏了現在輸了未來   2015-10-08 17:11
@hongyin
@贏了現在輸了未來
@hongyin
如果 父類的 

init(name: String) {...}

變成 

init?(name: String) { ... }

子類重寫成

init(name: String) {...}

就可以,為什么反過來就不行了呢?


這樣啊,值得深思。

是的,所以我很郁悶呢。我的QQ : 26743552 ,可以加一個嗎,討論一下。

可以,晚點加你。
Swift 頭像
蘋果5袋
5
Swift   2015-10-08 21:51

SWIFT2.0的翻譯文檔里做了如下說明


重寫一個可失敗構造器


就如同其它構造器一樣,你也可以用子類的可失敗構造器重寫基類的可失敗構造器?;蛘吣阋部梢杂米宇惖姆强墒嬙炱髦貙懸粋€基類的可失敗構造器。這樣做的好處是,即使基類的構造器為可失敗構造器,但當子類的構造器在構造過程不可能失敗時,我們也可以把它修改過來。

注意當你用一個子類的非可失敗構造器重寫了一個父類的可失敗構造器時,子類的構造器將不再能向上代理父類的可失敗構造器。一個非可失敗的構造器永遠也不能代理調用一個可失敗構造器。


注意: 你可以用一個非可失敗構造器重寫一個可失敗構造器,但反過來卻行不通。

hongyin 頭像
蘋果0袋
0
hongyin   2015-10-08 22:34
@Swift

SWIFT2.0的翻譯文檔里做了如下說明


重寫一個可失敗構造器


就如同其它構造器一樣,你也可以用子類的可失敗構造器重寫基類的可失敗構造器?;蛘吣阋部梢杂米宇惖姆强墒嬙炱髦貙懸粋€基類的可失敗構造器。這樣做的好處是,即使基類的構造器為可失敗構造器,但當子類的構造器在構造過程不可能失敗時,我們也可以把它修改過來。

注意當你用一個子類的非可失敗構造器重寫了一個父類的可失敗構造器時,子類的構造器將不再能向上代理父類的可失敗構造器。一個非可失敗的構造器永遠也不能代理調用一個可失敗構造器。


注意: 你可以用一個非可失敗構造器重寫一個可失敗構造器,但反過來卻行不通。

注意: 你可以用一個非可失敗構造器重寫一個可失敗構造器,但反過來卻行不通。 反過來有什么不可以的呢?能給解釋一下嗎?
一葉知秋 頭像
蘋果2袋
2
一葉知秋   2015-10-10 11:16
樓主真打破砂鍋問到底啊,鉆研精神可嘉,不過這個背后的道理估計沒人知道,swift2才出來沒多久。
您還未登錄,請先登錄

熱門帖子

最新帖子

?