【发布时间】:2019-11-11 23:06:31
【问题描述】:
我读过In swift, why can't I instantiate a protocol when it has an initialiser?
我的问题集中在为什么编译器不能查看您的默认实现并基于它初始化对象?
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() 看起来有点像递归循环。
【问题讨论】:
-
协议只是定义了一个接口。这不是具体的。
-
Why does it have to be tied to a concrete type?因为这是它指定的用途 -
@rmaddy 协议只是定义了一个接口。它不是具体的。 所以呢?
-
看看In swift, why can't I instantiate a protocol when it has an initialiser?。 TL;DL:协议不是具体类型,所以当你调用
Protocol.init()时,编译器不知道要初始化什么具体类型。它只会知道你要初始化的类型有Protocol描述的接口。 -
@DávidPásztor 我看到了,谢谢。 编译器不知道要初始化什么具体类型 它必须这样做吗?它已经拥有扩展中所需的所有实现细节。编译器如何不必实现默认函数?这有什么不同?为什么编译器不能允许默认实现作为其最基本的一致性?我猜你可能会争辩说编译器无法知道你是否已经实现了它的所有要求。对?所以依赖扩展并不是万无一失的解决方案
标签: swift initialization protocols swift-protocols designated-initializer