我正在尝试从Swift 2中的Realm查询迭代结果。存储了两个PersonClass对象。
查询的结果var有效且包含两个PersonClass对象,但在迭代结果时,name属性为空字符串。
class PersonClass: Object {
var name = ""
}
let realm = try! Realm()
@IBAction func button0Action(sender: AnyObject) {
let results = realm.objects(PersonClass)
print(results) //prints two PersonClass object with the name property populated
for person in results {
let name = person.name
print(name) //prints and empty string
}
}
答案 0 :(得分:7)
问题是您已从模型类中的属性声明中省略了dynamic
修饰符。 dynamic
修饰符是确保Realm有机会拦截对属性的访问权限所必需的,这使得Realm有机会从磁盘上的文件读取/写入数据。省略此修饰符会导致Swift编译器直接访问实例变量,从而将Realm从循环中删除。
答案 1 :(得分:0)
动态
告诉运行时对函数或变量修改的静态分派使用动态分派
将@objc属性隐式添加到变量或函数声明中。
使用dynamic关键字的任何东西都使用Objective-C运行时而不是Swift运行时来向它发送消息。
动态对于应用分析情况很有用,但牺牲了静态调度提供的优化。
动态调度与依赖于KVC / KVO的Core Data等Objective-C运行时函数增加了更好的互操作性。
来自Swift语言参考
将此修饰符应用于可以表示的类的任何成员 通过Objective-C。使用动态标记成员声明时 修饰符,始终使用动态调度对该成员的访问 Objective-C运行时。永远不会内联或访问该成员 由编译器虚拟化。