当创建扩展通用基类的子类对象时,如果它是使用便捷构造函数创建的,则回调包含通用对象将在运行时崩溃,因为传回的对象不正确/已损坏。 它是Swift3.1中的新功能。 Swift 3.0中没有这样的问题。 它只在使用便利构造函数创建对象时发生。
protocol Initializable {
init()
}
class MyClass: Initializable {
required init() {}
func log() {
print("Hello")
}
}
class Parent<T: Initializable> {
typealias Callback = (T) -> Void
init(callback: Callback) {
callback(T())
}
}
class Child: Parent<MyClass> {
convenience init(value: Int, callback: Callback) {
self.init(callback: callback)
}
override init(callback: Callback) {
super.init(callback: callback)
}
}
let _ = Child { data in
data.log() //This is OK
}
let _ = Child(value: 0) { data in
data.log() //This will crash under swift3.1
}
这是语言错误吗?或者我在做一些不应该做的事情?