Codable - arrayPropety [AnyObject]: ссылка на «данные» члена не может быть разрешена без контекстного типа - PullRequest
3 голосов
/ 20 июня 2019

Настройка Codable Class. Массив AnyObjects создает ошибку компиляции:

Ссылка на член 'data' не может быть разрешена без контекстного типа

class ClassA<T>: NSObject, Codable {

    // MARK: - Properties

    let title: String
    let data: [T] // data is an array of either Codable objects of ClassB or ClassC. 

    // MARK: - Keyes

    private enum CodingKeys: String, CodingKey {
        case title
        case data
    }

    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)

        title = try container.decode(String.self, forKey: .title)
        data = [T]()
    }

    func encode(to encoder: Encoder) throws {

        var container = encoder.container(
            keyedBy: CodingKeys.self
        )

        try container.encode(title, forKey: .title)
        try container.encode(data, forKey: .data) // Compilation error: Reference to member 'data' cannot be resolved without a contextual type
    }
}

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Для метода encode(_:, forKey:) требуется тип, соответствующий Encodable, иначе как он может знать, как кодировать этот входной аргумент?Поэтому вам нужно либо изменить параметр универсального типа, чтобы он требовал соответствия Encodable / Codable, либо не кодировать переменную data, если она не должна быть частью вашего JSON (как кажется, это не так).в любом случае часть декодированного JSON).

Просто настройте ClassB и ClassC на Codable, и тогда изменение ограничения типа не будет проблемой, и вам даже не понадобятся пользовательскиеinit(from:) и encode(to:) методы.

class ClassA<T: Codable>: Codable {

    // MARK: - Properties
    let title: String
    let data: [T] // data is an array of either Codable objects of ClassB or ClassC. 
}

Не имеет отношения к вашей проблеме, но вы не должны заставлять классы Swift наследовать от NSObject, если вам это не нужно для совместимости с Obj-C.Классы Swift не должны наследоваться от базового класса в отличие от Obj-C.

1 голос
/ 20 июня 2019

Тип данных T должен соответствовать Encodable/Codable изменить

class ClassA<T:Codable>: NSObject, Codable {

компилятор не будет знать, соответствует ли общий элемент массива Encodable или нет, следовательно, ошибка

...