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