Codable类中的可编码变量

时间:2018-06-13 12:36:29

标签: swift codable

鉴于此课程:

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

我收到错误:

  

输入' MyClass'不符合协议' Decodable'

     

输入' MyClass'不符合协议' Encodable'

如何将一个符合Codable的泛型变量作为Codable类中的属性?

3 个答案:

答案 0 :(得分:2)

如果我正确地提出你的问题可能会是这样的

class MyClass<T: Codable>: Codable {
    var variable : T? = nil
}

答案 1 :(得分:2)

如果您尝试实施解码器,您将拥有以下内容:

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)
    }
}

但是你应该放置一个类类型(例如String.self)而不是XXXX。你能放在这里什么?编译器无法猜出你想要什么。您可以使用符合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)
    }
}

答案 2 :(得分:0)

你不能。

但作为一种解决方法,您可以创建符合Codable的enum

enum SubType: Codable {
    case foo
    case bar
}