协议扩展初始值设定项强制调用 self.init



我刚刚阅读了有关协议初始值设定项要求的 Apple Swift 4 文档,并在协议扩展中提供了默认实现。

import UIKit
protocol Protocol {
init()
}
extension Protocol {
init() {
print("SDf")
self.init() // Line 1
// Compiler error occured if this is omitted 
//"'self.init' isn't called on all paths before returning from initializer"
}
}
struct Structure: Protocol {
init(string: String) {
}
}
Structure()      // Line 2

现在如您所见,执行将进入循环,因为默认情况下该结构没有init()的实现,因此提供的 init 协议将被调用,它将再次调用自己,因此它进入无限循环。

现在,知道了这一点,如果我删除第 1 行,编译器会给出错误。

问。为什么它迫使我在1号线上使用self.init(),我怎样才能摆脱这种情况?

考虑这个例子:

protocol P {
init()
}
extension P {
init() {
} // error: 'self.init' isn't called on all paths before returning from initializer
}
struct S : P {
var str: String
}
let s = S()
print(s.str)

假设它已编译 – 我们可以创建一个S值,而无需为str属性提供值。这就是为什么编译器抱怨您的协议扩展实现没有调用self.initinit()的原因。它需要你链接到其他一些初始化器需求——一个你没有提供默认实现的需求(否则你可能会进入递归循环,正如你发现的那样(,因此采用类型需要实现一个可以完全初始化自己的需求。

例如,这是合法的:

protocol P {
init()
init(str: String)
}
extension P {
init() {
self.init(str: "some default")
}
}
struct S : P {
var str: String
}
let s = S()
print(s.str) // some default

因为现在我们链接到init(str:)要求,S必须实现该要求(在这种情况下,它由隐式成员初始化器满足(。

相关内容

最新更新