【发布时间】:2022-01-02 15:18:54
【问题描述】:
我有这个示例协议,它有一个带扩展名的默认值属性。
protocol SampleProtocol{
var sample:String?{get set}
}
extension SampleProtocol{
var sample:String?{ get { return nil } set{} }
}
现在,我的 TestClass 实现了 SampleProtocol,如下所示。
class TestClass:SampleProtocol {
var sample: String?{
return "TestClass"
}
}
还有一种辅助方法可以打印来自 SampleProtocol 的样本值。
func printValue(_ value: SampleProtocol){
print(value.sample)
}
现在问题来了
let testObj = TestClass()
print(testObj.sample) // prints "TestClass"
printValue(testObj) // prints nil
从上面的结果,我需要明白为什么当testObj被类型转换为SampleProtcol时,它考虑的是扩展的默认实现而不是TestClass的实现?
【问题讨论】:
-
您正在 TestClass 中创建一个新的计算 var,而不是使用协议 var.. 在 TestClass 中尝试这个
var sample: String? = "TestClass"。 -
我不知道其根本原因,但它不起作用,因为您的类中有一个计算属性,如果您将其更改为存储属性,您将获得预期的行为跨度>
-
哇,将
sample更改为存储属性效果很好。我的意思是,如果你们知道的话,任何解释或 Swift 文档都会非常有帮助。
标签: ios swift iphone macos swift-protocols