如何访问未保存到Realm数据库的临时属性?
解决Core Data实体临时属性的解码与持久化问题
看起来你是在处理Core Data实体的解码逻辑,同时想要保留isAccessible作为本地临时属性——不需要从JSON解码,也不用存入数据库对吧?咱们来调整代码解决这个问题:
核心问题分析
你现在把isAccessible放进了CodingKeys枚举里,这会导致两个不必要的问题:
- 解码时会强制尝试从JSON中读取这个字段,如果API返回的JSON里没有
isAccessible,解码流程会直接抛出错误; - 虽然你没给
isAccessible加@objc dynamic修饰符,Core Data不会把它持久化,但把它放在CodingKeys里完全没必要,反而会增加解码的风险。
修正后的代码
class Item: Object, Decodable { @objc dynamic var eid: Int = 0 // 临时属性:无需解码、无需持久化,保持当前定义即可 var isAccessible: Bool = false // 只包含需要从JSON解码的持久化属性 private enum CodingKeys : String, CodingKey { case eid // 移除isAccessible,不让它参与解码流程 } required convenience init(from decoder: Decoder) throws { self.init() let container = try decoder.container(keyedBy: CodingKeys.self) self.eid = try container.decode(Int.self, forKey: .eid) // 不需要处理isAccessible,它的默认值就是false,后续可以在本地逻辑里自由修改 } }
关键说明
- 移除CodingKeys中的isAccessible:这样解码时只会处理
eid字段,即使JSON里没有isAccessible也不会触发解码错误; - 临时属性的定义:
isAccessible没有@objc dynamic修饰,Core Data会自动忽略这个属性,不会把它存入数据库,完全符合你“临时值”的需求; - 本地修改临时属性:你可以在任何业务逻辑中直接修改
isAccessible的值,比如item.isAccessible = true,这个变化只会存在于内存中,不会被持久化到Core Data。
内容的提问来源于stack exchange,提问作者mikro098
相关产品推荐
相关产品推荐

