pra*_*14k 5 swift swift-protocols
我只是在阅读有关协议初始值设定项要求的 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
Run Code Online (Sandbox Code Playgroud)
现在如您所见,执行将进入循环,因为默认情况下该结构没有实现 for init(),因此将调用提供的协议 init 并再次调用自身,因此进入无限循环.
现在,知道了这一点,如果我删除第 1 行,编译器就会给出错误。
Q. 为什么强制我self.init()在1号线使用,如何摆脱这种情况?
考虑这个例子:
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)
Run Code Online (Sandbox Code Playgroud)
假设它已编译 - 我们将能够创建一个S值而无需为该str属性提供值。这就是为什么编译器抱怨你的协议扩展实现init()没有调用self.init. 它需要你链接到一些其他的初始化器需求——你不提供默认实现的一个(否则你可能会进入递归循环,正如你发现的那样),因此采用类型需要实现一个它可以完全初始化自己。
例如,这是合法的:
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
Run Code Online (Sandbox Code Playgroud)
因为现在我们正在链接到必须实现的init(str:)要求(在这种情况下,它由隐式成员初始化器满足)。S
| 归档时间: |
|
| 查看次数: |
2073 次 |
| 最近记录: |