是的是重写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的翻译文档里做了如下说明
重写一个可失败构造器
注意当你用一个子类的非可失败构造器重写了一个父类的可失败构造器时,子类的构造器将不再能向上代理父类的可失败构造器。一个非可失败的构造器永远也不能代理调用一个可失败构造器。
注意: 你可以用一个非可失败构造器重写一个可失败构造器,但反过来却行不通。