我有一个符合可解码协议(从API获取数据)的类,我想将它保存在Realm数据库中。当我的一个属性是array(List)时发生问题。上面写着Cannot automatically synthesize Decodable because List<Item> does not conform to Decodable
绕过这个问题的最佳方法是什么?Realm只支持基元类型的数组。
这是我的课:

class PartValue: Object, Decodable {
    @objc dynamic var idetifier: Int = 0
    let items = List<Item>()
}

最佳答案

使用Swift 4.1中实现的期待已久的条件一致性,您可以简单地声明List符合Decodable,以防其Element符合Decodable

extension List: Decodable where List.Element: Decodable {
    public convenience init(from decoder: Decoder) throws {
        self.init()
        var container = try decoder.unkeyedContainer()
        let array = try container.decode(Array<Element>.self)
        self.append(objectsIn: array)
    }
}

要使此方法适用于您的特定案例,您需要确保Item也符合Decodable
如果您还需要Encodable一致性,只需扩展List来支持它。
extension List: Encodable where List.Element: Encodable {
    public func encode(to encoder: Encoder) throws {
        var container = encoder.unkeyedContainer()
        try container.encode(contentsOf: Array(self))
    }
}

07-27 22:29