使用@Persisted 编码 Realm 模型会给出 Swift EncodingError 消息

Encoding Realm models using @Persisted gives a Swift EncodingError message

尝试对此进行编码时:

class MyClass: Object, Codable {
  @Persisted var someValue: String
}

// I've created and added MyClass to Realm. I then query for it and get a `myClassResult` object 

let jsonString = try myClassResult.encode(to: JSONEncoder())

我收到这个错误:

Swift.EncodingError.invalidValue(RealmSwift.Persisted<Swift.String>(storage: RealmSwift.(unknown context at d2a3778).PropertyStorage<Swift.String>.managed(key: 0)), Swift.EncodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "someValue", intValue: nil)], debugDescription: "Only unmanaged Realm objects can be encoded using automatic Codable synthesis. You must explicitly define encode(to:) on your model class to support managed Realm objects.", underlyingError: nil))

编码和解码在使用 @objc dynamic var 注释时适用于较早版本的 Realm。当我更新我的代码以使用带有 @Persisted 注释的 Realm v.10.21.0 时,错误开始了。

你需要在你的模型上实现 encode(to:) class:

class MyClass: Object, Codable {
    @Persisted var someValue: String

    enum CodingKeys: String, CodingKey {
        case someValue
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(someValue, forKey: .someValue)
    }
}

// After querying for a `myClassResult` object.

do {
    let jsonString = try myClassResult.encode(to: JSONEncoder())

} catch {
    print(error)
}