Swift 扩展 - 必须在非专用泛型类型上声明约束扩展 'Array'

Swift extension - Constrained extension must be declared on the unspecialized generic type 'Array'

我有一个 API returns 一个 JSON 对象数组。我已将结构设置如下:

typealias MyModels = [MyModel]

struct MyModel: Codable {
    let field1: String
    let field2: String
    let mySubModel: SubModel?
    
    enum CodingKeys: String, CodingKey {
        case field1 = "Field1"
        case field2 = "Field2"
        case mySubModel = "MySubModel"
    }
}

struct SubModel: Codable {
    let subModelField1: String
    let subModelField2: String
    
    enum CodingKeys: String, CodingKey {
        case subModelField1 = "SubModelField1"
        case subModelField2 = "SubModelField2"
    }
}

我想要做的是添加这个扩展,提供路径变量(NetworkModel 协议为 API 操作提供了一些基本功能):

extension MyModels: NetworkModel {
    static var path = "the/endpoint/path"
}

我在其他 model/struct class 中没有任何问题,当基数是一个对象或 json 键时,我以这种方式设置。但是,由于这个不同并且只是一个数组,所以当我将该扩展名放入 class:

时出现此错误

Constrained extension must be declared on the unspecialized generic type 'Array' with constraints specified by a 'where' clause

我已经进行了一些挖掘并尝试了一些关于扩展名的 where 子句的事情,但我对它想要什么感到有点困惑。我敢肯定这很简单,但是对此有什么想法吗?如果我需要用上面的类型别名以不同的方式处理它,我可以接受。提前致谢!

我假设你的意思是

extension MyModels: NetworkModel {

有错误?您似乎错过了一个 s

错误基本上是告诉你这样做:

extension Array : NetworkModel where Element == MyModel {
    static var path = "the/endpoint/path"
}

您不能简单地扩展 [MyModel]

虽然 Sweeper 根据最初的问题适当地回答了问题,但我想提供一种替代方法,即使可能稍微复杂一些。这可以通过覆盖事物的可解码方面并手动将模型放入列表中来实现:

struct MyModels: Codable {
    var modelList: [MyModel] = []

    public init(from decoder: Decoder) throws {
        var container = try decoder.unkeyedContainer()
        let metaType = (Account.self as Decodable.Type)

        while !container.isAtEnd {
            let subdecoder = try container.superDecoder()
            if let model = try metaType.init(from: subdecoder) as? MyModel {
                modelList.append(model)
            }
        }
    }
}

struct MyModel: Codable {
    let subModelField1: String
    let subModelField2: String

    enum CodingKeys: String, CodingKey {
        case subModelField1 = "SubModelField1"
        case subModelField2 = "SubModelField2"
    }
}

extension MyModels: NetworkModel {
    static var path = "the/endpoint/path"
}