我已经阅读了In swift,为什么我不能实例化具有初始化程序的协议?
我的问题集中在为什么编译器不能查看您的默认实现并基于它初始化对象?
protocol ViewModel {
var radius: Int { get }
init()
}
extension ViewModel {
var radius: Int { return 2}
init() {}
}
let v = ViewModel() // ERROR:
无法实例化协议类型“ViewModel”
问题1:
为什么 Swift 不允许协议的原始初始化?为什么它必须与具体类型相关联?
我知道它不是一个具体的类型。但是为什么编译器不允许你创建一个只有协议默认值的类型呢?!是不是因为编译器就像嘿听一样,而我可以将您视为接口/协议或实际类型。我不能认为你们两个!?你要么是记忆中的真实存在,要么只是一个蓝图。
如果语言可以检查扩展是否为所有需求提供了实现,那么允许将其初始化为特殊情况是否有意义?(我知道它没有,但想知道的是唯一需要让它工作)或者即使那样这也没有意义。如果是,为什么?
此外,我尝试这样做:
protocol ViewModel {
var radius: Int { get }
init()
}
extension ViewModel {
var radius: Int { return 2}
init() {
self.init() // Line A:
}
}
struct ReallyNothing: ViewModel {}
let v = ReallyNothing()
如果我注释掉 LineA 那么我会得到一个错误
在从初始化程序返回之前,不会在所有路径上调用“self.init”
问题2:
为什么?为什么init
必须调用self.init()
它似乎有点像递归循环。