我试图理解以下内容,人为,例如:
protocol MyProtocol {
init?(string: String)
}
class MyObject: MyProtocol {
let s: String
required init(string: String) {
self.s = string
}
}
let o = MyObject(string: "test")
print(o.s)
MyProtocol
声明一个 failable initializer . MyObject
符合 MyProtocol
,示例代码编译和执行没有问题。
我的问题是:为什么 MyObject
不提供可失败的初始化程序(根据 MyProtocol
)?
最佳答案
这与编译的原因相同:
class A {
init?(s:String) {}
init() {}
}
class B : A {
override init(s:String) {super.init()}
}
init
可以覆盖(即被替代)init?
.
另见 docs (当某件事被如此清楚地记录下来时,问“为什么”似乎很愚蠢;这只是关于语言的事实):
A failable initializer requirement can be satisfied by a failable or nonfailable initializer on a conforming type.
(正如问题和答案的评论中所指出的,如果您考虑碰巧永远不会失败的 init?
和具有相同签名的 init
之间的区别,这就很有意义了——即,没有有效的区别。换句话说:你可以告诉我我可能失败,但你不能告诉我我必须失败。)
关于swift - 如果一个类实现了声明一个可失败初始化器的协议(protocol),为什么它不必提供可失败初始化器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37730690/