[英]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 MyModel
的Array of MyModel
創建擴展。
extension Array: MyProtocol where Element : MyProtocol {
static var name: String {
return Element.name
}
}
現在,如果你定義一個新的類型一致( MyNewModel
)到MyProtocol,自動數組MyNewModel
將自動符合MyProtocol
。 就像Equatable
和Codable
發生的Codable
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.