我正在尝试创建一个很好的通用包装器来获取和处理数据。目的是模型可以实现协议(protocol),因此与我的通用包装器兼容,但我在这样做时遇到了一些问题。
我注意到 Codable
协议(protocol)按照我希望协议(protocol)的方式运行,似乎继承 Codable
的对象数组被视为符合数据类型。然而,我创建的协议(protocol)似乎并非如此。
这是我要实现的目标:
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
以我想要使用我的协议(protocol)的方式行事,但我不确定如何实现这一点以及它是否承载了比保证的更多的工作结果。非常感谢任何帮助!
最佳答案
泛型
看看你在这里使用的泛型类型
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 of MyModel
创建扩展。
extension Array: MyProtocol where Element : MyProtocol {
static var name: String {
return Element.name
}
}
现在,如果您定义一个符合 (MyNewModel
) 到 MyProtocol 的新类型,MyNewModel
数组将自动自动符合 MyProtocol
。就像 Equatable
和 Codable
一样。
关于ios - 如何使对象数组符合我的协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59536302/