我遇到了Realm Swift的问题。我有一个对象,它假设存储有关用户创建的字符的信息。但是某些属性不能保存。如果我只用一个字母切换对象的名称,它会保存并正确读回。第一个示例拒绝保存除race
属性的默认值之外的任何内容,但第二个示例将任何值保存到racea
属性,没有任何问题。造成这种情况的原因是什么?
示例1
class Character: Object {
//MARK: Properties
dynamic var id: Int = 1
dynamic var name: String = "John Appleseed"
dynamic var level: Int = 1
dynamic var exp: Int = 0
dynamic var race: Int = 0
dynamic var career: Int = 0
dynamic var currentHealth: Int = 100
dynamic var inventory: Inventory? = Inventory()
//MARK: Realm
override static func primaryKey() -> String? {
return "id"
}
}
示例2
class Character: Object {
//MARK: Properties
dynamic var id: Int = 1
dynamic var name: String = "John Appleseed"
dynamic var level: Int = 1
dynamic var exp: Int = 0
dynamic var racea: Int = 0
dynamic var career: Int = 0
dynamic var currentHealth: Int = 100
dynamic var inventory: Inventory? = Inventory()
//MARK: Realm
override static func primaryKey() -> String? {
return "id"
}
}
扩展
extension Character {
func getRace() -> String {
return Fitventure.species[race]
}
}
答案 0 :(得分:0)
如果getRace()
函数引起了问题,那么对我来说,这可能是Swift与Realm用来工作的Objective-C运行时反射功能之间的不幸碰撞。
Realm为其每个属性动态生成自己的访问器,以便明确管理如何从磁盘保存和检索数据。因此,不可能覆盖Realm属性的访问器,这样做会产生奇怪的行为。
最佳实践是您已经发现的:当创建另一个以某种方式转换Realm属性的方法时,您需要确保该函数没有可能由Objective-C运行时隐式生成的名称。