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/

相关文章:

swift - 如何修复 Swift Sort 函数错误?

windows - Chrome 中的协议(protocol)处理程序通过注册表

swift - Statusbar.image 颜色错误

ios - Swift:如何使用 CLLocationCoordinate2D 将坐标存储为字符串或整数?

ios - 更改 TabBar mask 颜色(不透明)

swift - 如何为动画中的单个 SKTextures 设置持续时间

ios - 如何使用委托(delegate)/协议(protocol)在多个 View Controller 之间传递值

ios - 向 UIButton touchesBegan 添加声音的协议(protocol)

ios - 当我选择单元格时,UIImageView.image 在我的 UITableViewCell 中为 nil,即使我知道它应该有一个值

ios - 无法将类型 '__NSDictionaryM' 的值转换为 'NSArray"