[英]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.