[英]Swift Extension computed variable not read correctly until declared in protocol
我有一个协议扩展,它声明并分配一个静态计算变量:
protocol DataType {
}
extension DataType {
static var mocks: [Self] { [] }
}
然后我有另一个名为 Provider 的协议,它具有 DataType 协议和扩展的associatedtype
类型要求:
protocol Provider {
associatedtype Data: DataType
}
extension Provider {
static var mock: [Data] {
Data.mocks
}
}
然后我创建了以下符合 DataType 和 Provider 的类型:
struct Car: DataType {
var name: String
static var mocks: [Car] {
[.init(name: "Nissan"), .init(name: "Toyota")]
}
}
struct CarProvider: Provider {
typealias Data = Car
}
print(CarProvider.mock)
当我打印出来(空数组[]
则CarProvider
静态变量mock
打印出的默认值mocks
数据类型的变量-即使当Car
具有用于分配的阵列值mocks
其结构定义内
但是,一旦我将DataType
协议中的mocks
属性声明为要求,就会正确读取Car
的mocks
值(打印正确的值: [__lldb_expr_93.Car(name: "Nissan"), __lldb_expr_93.Car(name: "Toyota")]
):
protocol DataType {
static var mocks: [Self] { get }
}
为什么首先需要在协议定义中定义属性? 扩展值不应该足够吗? 并且由于Car
结构将自己的值分配给mocks
变量,难道不应该读取它而不是默认扩展值吗?
为什么首先需要在协议定义中定义属性? 扩展值不应该足够吗?
不可以。协议扩展中的实现只能被视为真正的默认实现,前提是有某种方法可以在范围内覆盖它。 没有协议中的要求,Swift 没有理由或机制超越扩展,因为在语义上没有其他匹配项。
protocol DataType { }
extension DataType {
static var mocks: [Self] { [] }
}
func mocks<Data: DataType>(_: Data.Type) -> [Data] {
Data.mocks // This *is* the extension. That is the only truth.
}
protocol DataType {
static var mocks: [Self] { get }
}
extension DataType {
static var mocks: [Self] { [] }
}
func mocks<Data: DataType>(_: Data.Type) -> [Data] {
Data.mocks // Now, we can dispatch to a concrete `Data` type!
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.