swift - 如果一个类实现了一个声明一个的协议(protocol),为什么它不必提供一个可失败的初始化程序?

原文 标签 swift swift2 protocols

我试图理解以下人为的例子:

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/

相关文章:

objective-c - 协议(protocol)中的可选方法有什么意义?

ios - 如何使用映射和过滤器从一维数组生成二维数组?

ios - iOS可以正常运行,但在设备上运行时会出错

xcode - 编程制作可拖动标签时,我不断收到SIGABRT错误?

c - 如何将数组拆分为特定大小

objective-c - 如何在Swift中调用也具有多个参数的Objective C方法

ios - 附加到ScrollView上方的叠加 View 的手势识别器?

objective-c - 无法从Objective-c调用某些Swift函数(其他工作)

ios - 在 Swift SpriteKit 中的场景之间显示 Admob 插页式广告

ios - 保留UIButton的圆形边缘