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

Rob*_*eph 5 protocols swift swift2

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

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)
Run Code Online (Sandbox Code Playgroud)

MyProtocol声明一个可用的初始化器.MyObject符合MyProtocol并且示例代码编译并执行没有问题.

我的问题是:为什么不MyObject 具备提供failable初始化(按MyProtocol)?

mat*_*att 6

这与编译的原因相同:

class A {
    init?(s:String) {}
    init() {}
}
class B : A {
    override init(s:String) {super.init()}
}
Run Code Online (Sandbox Code Playgroud)

init可以覆盖(即替代)init?.

另请参阅文档(当某些内容如此清晰地记录下来时,问"为什么"似乎很愚蠢;这只是关于语言的一个事实):

可符合类型的可用或不可用的初始化程序可以满足可用的初始化程序要求.

(正如在关于问题和答案的评论中指出的那样,如果你想到一个init?永远不会失败的东西和一个init同样的签名之间的区别,那就完全没有意义 - 也就是说,没有有效的区别.另一种方式:你可以告诉我,我可能会失败,但你不能告诉我,我必须失败.)

  • 这是因为可以使用的初始化程序需要返回一个`nil`或`non-nil`对象.由于不可用的初始值设定项总是返回一个"非nil"对象,因此它满足了他的协议,并且只是有意义. (3认同)