是的是重寫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) {
^
為啥不能重寫呢?我想知道背后的原因。
把init后的?號(hào)去掉
override init(name: String) { super.init(name:name) if name.isEmpty { return nil } }
把init后的?號(hào)去掉
override init(name: String) { super.init(name:name) if name.isEmpty { return nil } }
把init后的?號(hào)去掉
override init(name: String) { super.init(name:name) if name.isEmpty { return nil } }
是重寫的話,應(yīng)該是要和父類的方法完全一致,否則怎么叫重寫呢。
init(name: String) {...}
變成
init?(name: String) { ... }
子類重寫成
init(name: String) {...}
就可以,為什么反過來就不行了呢?
init(name: String) {...}
變成
init?(name: String) { ... }
子類重寫成
init(name: String) {...}
就可以,為什么反過來就不行了呢?
init(name: String) {...}
變成
init?(name: String) { ... }
子類重寫成
init(name: String) {...}
就可以,為什么反過來就不行了呢?
是的,所以我很郁悶?zāi)?。我的QQ : 26743552 ,可以加一個(gè)嗎,討論一下。
init(name: String) {...}
變成
init?(name: String) { ... }
子類重寫成
init(name: String) {...}
就可以,為什么反過來就不行了呢?
是的,所以我很郁悶?zāi)?。我的QQ : 26743552 ,可以加一個(gè)嗎,討論一下。
SWIFT2.0的翻譯文檔里做了如下說明
重寫一個(gè)可失敗構(gòu)造器
注意當(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)造器,但反過來卻行不通。
SWIFT2.0的翻譯文檔里做了如下說明
重寫一個(gè)可失敗構(gòu)造器
注意當(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)造器,但反過來卻行不通。