swift – 如果一个类实现了一个声明一个的协议,为什么一个类不能提供一个可用的初始化器?

我试图理解以下,做作的例子:

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之间的差异,这就完全有道理 – 也就是说,没有有效的区别.换句话说:你可以告诉我,我可能会失败,但你不能告诉我,我必须失败.)

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...