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

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

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

是的是重寫init方法時(shí)出錯(cuò),我就是想知道 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 }

    }

}


出錯(cuò)在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) {

    ^

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



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

把init后的?號(hào)去掉

override init(name: String) {

    super.init(name:name)

    if name.isEmpty { return nil }

}

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

把init后的?號(hào)去掉

override init(name: String) {

    super.init(name:name)

    if name.isEmpty { return nil }

}

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

把init后的?號(hào)去掉

override init(name: String) {

    super.init(name:name)

    if name.isEmpty { return nil }

}

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

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

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

init(name: String) {...}

變成 

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

子類重寫成

init(name: String) {...}

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


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

init(name: String) {...}

變成 

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

子類重寫成

init(name: String) {...}

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


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

init(name: String) {...}

變成 

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

子類重寫成

init(name: String) {...}

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


這樣啊,值得深思。

是的,所以我很郁悶?zāi)?。我的QQ : 26743552 ,可以加一個(gè)嗎,討論一下。

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

init(name: String) {...}

變成 

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

子類重寫成

init(name: String) {...}

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


這樣啊,值得深思。

是的,所以我很郁悶?zāi)?。我的QQ : 26743552 ,可以加一個(gè)嗎,討論一下。

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

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


重寫一個(gè)可失敗構(gòu)造器


就如同其它構(gòu)造器一樣,你也可以用子類的可失敗構(gòu)造器重寫基類的可失敗構(gòu)造器?;蛘吣阋部梢杂米宇惖姆强墒?gòu)造器重寫一個(gè)基類的可失敗構(gòu)造器。這樣做的好處是,即使基類的構(gòu)造器為可失敗構(gòu)造器,但當(dāng)子類的構(gòu)造器在構(gòu)造過程不可能失敗時(shí),我們也可以把它修改過來。

注意當(dāng)你用一個(gè)子類的非可失敗構(gòu)造器重寫了一個(gè)父類的可失敗構(gòu)造器時(shí),子類的構(gòu)造器將不再能向上代理父類的可失敗構(gòu)造器。一個(gè)非可失敗的構(gòu)造器永遠(yuǎn)也不能代理調(diào)用一個(gè)可失敗構(gòu)造器。


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

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

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


重寫一個(gè)可失敗構(gòu)造器


就如同其它構(gòu)造器一樣,你也可以用子類的可失敗構(gòu)造器重寫基類的可失敗構(gòu)造器?;蛘吣阋部梢杂米宇惖姆强墒?gòu)造器重寫一個(gè)基類的可失敗構(gòu)造器。這樣做的好處是,即使基類的構(gòu)造器為可失敗構(gòu)造器,但當(dāng)子類的構(gòu)造器在構(gòu)造過程不可能失敗時(shí),我們也可以把它修改過來。

注意當(dāng)你用一個(gè)子類的非可失敗構(gòu)造器重寫了一個(gè)父類的可失敗構(gòu)造器時(shí),子類的構(gòu)造器將不再能向上代理父類的可失敗構(gòu)造器。一個(gè)非可失敗的構(gòu)造器永遠(yuǎn)也不能代理調(diào)用一個(gè)可失敗構(gòu)造器。


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

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

熱門帖子

最新帖子

?