Кодируемая переменная в Codable Class - PullRequest
0 голосов
/ 13 июня 2018

Учитывая этот класс:

class MyClass: Codable {
    var variable : Codable? = nil
}

Я получаю ошибку:

Тип 'MyClass' не соответствует протоколу 'Decodable'

Тип 'MyClass'не соответствует протоколу' Encodable '

Как я могу иметь универсальную переменную, которая соответствует Codable как свойство в классе Codable?

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Может быть так, если я правильно понял ваш вопрос

class MyClass<T: Codable>: Codable {
    var variable : T? = nil
}
0 голосов
/ 13 июня 2018

Если вы попытаетесь реализовать свой декодер, у вас будет что-то вроде:

class MyClass: Codable {
    var variable: Codable?
    enum MyClassKeys: String, CodingKey {
        case variable = "variable"
    }
    required init(from decoder: Decoder) {
        let container = try! decoder.container(keyedBy: MyClassKeys.self)
        variable = try! container.decode(XXXX, forKey: .variable)
    }
}

Но вместо XXXX вы должны указать тип класса (например, String.self).Что вы можете поставить здесь?Компилятор не может угадать, что вы хотите.Вместо Codable типа, возможно, вы можете поставить класс, соответствующий протоколу Codable.Таким образом, вы можете получить что-то вроде этого:

class MyClass: Codable {
    var variable: MyClass?
    enum MyClassKeys: String, CodingKey {
        case variable = "variable"
    }
    required init(from decoder: Decoder) {
        let container = try! decoder.container(keyedBy: MyClassKeys.self)
        variable = try! container.decode(MyClass.self, forKey: .variable)
    }
}
0 голосов
/ 13 июня 2018

Вы не можете.

Но в качестве обходного пути вы можете создать enum, соответствующий Codable.

enum SubType: Codable {
    case foo
    case bar
}
...