我有一个协议扩展,它声明并分配一个静态计算变量:
protocol DataType {
}
extension DataType {
static var mocks: [Self] { [] }
}
然后我有另一个名为 Providerassociatedtype
的协议,它需要 DataType 协议和扩展:
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
DataType 变量的默认值——即使在其结构定义Car
中有一个分配的数组值mocks
但是,只要我将协议mocks
内的属性声明DataType
为要求,就会正确读取 的mocks
值Car
(打印正确的值:)[__lldb_expr_93.Car(name: "Nissan"), __lldb_expr_93.Car(name: "Toyota")]
:
protocol DataType {
static var mocks: [Self] { get }
}
为什么协议定义中首先需要属性定义?扩展值不应该足够吗?而且由于Car
结构将自己的值分配给mocks
变量,不应该读取它而不是默认扩展值吗?