Быстрое расширение - ограниченное расширение должно быть объявлено для универсального универсального типа 'Array' - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть API, который возвращает массив объектов 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"
    }
}

Я хочу добавить это расширение, указав путь var (протокол NetworkModel предоставляет некоторые базовые функции для операций API):

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

У меня нет проблем с другими классами моделей / структур, которые я настраиваю таким образом, когда база является объектом или ключом json.Однако, поскольку этот объект отличается от других и просто является массивом, я получаю эту ошибку, когда помещаю это расширение в класс:

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

Я провел некоторое копание и пробовал несколько вещей с предложением whereна расширение, но я просто немного запутался, что он хочет.Я уверен, что это что-то простое, но есть мысли по этому поводу?Если мне нужно пойти по-другому с вышеперечисленными typealias, я в порядке с этим.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Хотя Sweeper ответил на вопрос надлежащим образом, исходя из первоначального вопроса, я хотел предложить альтернативный подход, даже если он потенциально немного более сложный.Это можно сделать, переопределив сторону Decodable и вручную поместив модели в список:

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"
}
0 голосов
/ 18 декабря 2018

Я предполагаю, что вы имеете в виду

extension MyModels: NetworkModel {

есть ошибка?Кажется, вы пропустили s там.

Ошибка в основном говорит вам сделать это:

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

Вы не можете просто сделать расширение [MyModel].

...