簡體   English   中英

如何使對象數組符合我的協議?

[英]How do I make an array of objects conform to my protocol?

我正在嘗試創建一個很好的通用包裝器來獲取和處理數據。 目的是模型可以實現協議並因此與我的通用包裝器兼容,但我在這樣做時遇到了一些問題。

我注意到Codable協議的行為方式與我希望協議的行為方式相同,似乎繼承Codable的對象數組被視為符合標准的數據類型。 然而,我創建的協議似乎並非如此。

這是我想要實現的目標:

protocol MyProtocol {
  static var name: String { get }
}
class MyService<T: MyProtocol> {

  let otherService = MyOtherService<T>()
}
struct MyModel: MyProtocol {
  let id: Int
  let name: String

  static var name: String {
    return "Name"
  }

和實例化:

let service = MyService<[MyModel]>()

但我遇到了錯誤Type '[MyModel]' does not conform to protocol 'MyProtocol'

我知道這是可能的,因為Codable以我想要使用我的協議的方式行事,但我不確定如何實現這一點,以及它是否承擔了比結果所保證的更多的工作。 任何幫助是極大的贊賞!

泛型

看看你在這里使用的泛型類型

let service = MyService<[MyModel]>()

泛型類型不是MyModel而是[MyModel]

換言之一個Array of MyModel ,其不符合MyProtocol

修復

您可以修復它使Array of MyModel符合MyProtocol

extension Array: MyProtocol where Element == MyModel {
    static var name: String {
        return "Array of MyModel"
    }
}

測試

現在你可以寫

let service = MyService<[MyModel]>()

更新

我想我們可以在這里走得更遠一點。

我們可以為泛型類型符合MyProtocol任何 Array 創建擴展,而不是為Array of MyModelArray of MyModel創建擴展。

extension Array: MyProtocol where Element : MyProtocol {
    static var name: String {
        return Element.name
    }
}

現在,如果你定義一個新的類型一致( MyNewModel )到MyProtocol,自動數組MyNewModel將自動符合MyProtocol 就像EquatableCodable發生的Codable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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