ios - 如何使对象数组符合我的协议(protocol)?

标签 ios swift generics protocols

我正在尝试创建一个很好的通用包装器来获取和处理数据。目的是模型可以实现协议(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。就像 EquatableCodable 一样。

关于ios - 如何使对象数组符合我的协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59536302/

相关文章:

ios - 从另外两个核心数据对象创建复合对象

c# - 使用运行时类型调用通用方法并强制转换返回对象

java - 如何在运行时获取对象类型?

java - 遍历 java 中的通用 HashMap

iphone - iOS 浏览器后退按钮发出 HTTP GET 而不是预期的 POST

android - 要嵌入 iOS/Android-View 的跨平台 3d 引擎?

ios - 3D Touch、peek 和 pop 崩溃并出现 fatal error : unexpectedly found nil while unwrapping an Optional value

ios - 如何测试包含应用程序是否授予 "Allow Full Access"权限?

ios - 在图像 xcasset Xcode 上使用向量并渲染为模板

ios - XIB 弹出窗口显示