我正在尝试学习Swift中覆盖可失败初始化器的概念,并遇到了以下语句:
将初始化委托给超类的唯一方法是强制解包可失败的超类初始化器的结果。
教科书没有提供任何代码来真正解释它的含义。请问有人能够友好地向我解释一下吗?最好附带一个代码示例!
我正在尝试学习Swift中覆盖可失败初始化器的概念,并遇到了以下语句:
将初始化委托给超类的唯一方法是强制解包可失败的超类初始化器的结果。
教科书没有提供任何代码来真正解释它的含义。请问有人能够友好地向我解释一下吗?最好附带一个代码示例!
我必须承认,"重写可失败初始化程序"这一部分很令人困惑。
下面的示例应该可以澄清这种情况:
假设您有一个带有可失败初始化程序的基类:
class Base {
let name: String
init?(name: String) {
guard !name.isEmpty else {
return nil
}
self.name = name
}
}
class Derived: Base {
let age: Int
init(name: String, age: Int) {
self.age = age
super.init(name: name) //<- error
}
}
error: a non-failable initializer cannot chain to failable initializer 'init(name:)' written with 'init?'
super.init(name: name)
^
这里的问题在于,子类的非可失败初始化器委托给了基类的可失败初始化器。
我们有两个选项来解决这个问题:
class Derived: Base {
let age: Int
init(name: String, age: Int) {
self.age = age
super.init(name: name)! // <- force unwrap
}
}
name
传递给子类初始化器,例如:let derived = Derived(name: "", age: 12)
fatal error: unexpectedly found nil while unwrapping an Optional value
class Derived: Base {
let age: Int
init?(name: String, age: Int) { // use failable initialiser
self.age = age
super.init(name: name) // <- propagate the failure with init?
}
}
nil
结果传播给调用者,这使得调用者负责适当地处理可选项。