【发布时间】:2022-01-04 02:11:26
【问题描述】:
关于以下代码:
protocol BananaProtocol {
var banana: Bool { get}
}
class MyBanana: BananaProtocol {
var banana = true
}
protocol BananaProvider {
var provider: BananaProtocol { get }
}
class BananaProviderImpl: BananaProvider {
var provider = MyBanana()
}
编译器报错:Type 'BananaProviderImpl' does not conform to protocol 'BananaProvider'
如果我改为:
class BananaProviderImpl: BananaProvider {
var provider = MyBanana() as BananaProtocol
}
有效。
为什么编译器不能推断 MyBanana 是 BananaProtocol 类型,因为它在类签名上? class MyBanana: BananaProtocol
对于理解此问题的帮助,我将不胜感激。 谢谢。
【问题讨论】:
-
var provider: BananaProtocol = MyBanana()也可以。 Swift 可能(猜测)正在查看var provider = MyBanana()并决定将其设为var provider: MyBanana = MyBanana(),这显然意味着您没有实现BananaProvider的要求 ????♂️ -
在我看来,Swift 在打字方面非常挑剔。在定义这些类型时它有一些期望,在大多数情况下
var provider: BananaProtocol = MyBanana()是最优雅的,因为您可以在某些情况下使用as来强制类型。在我自己的项目中,我几乎总是为每个变量定义类型,即使它不是非常复杂的情况。看起来漂亮整洁,实际上可以防止您在为这些变量分配新值或对象时出现编码错误。
标签: swift swift5 swift-protocols