簡體   English   中英

在協議中聲明之前,Swift 擴展計算變量無法正確讀取

[英]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屬性聲明為要求,就會正確讀取Carmocks值(打印正確的值: [__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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM