我正在尝试迭代Swift 2中Realm查询的Results。存储了两个PersonClass对象。
查询中的results 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
}
}
问题是在模型类的属性声明中省略了dynamic
修饰符。dynamic
修饰符是必要的,以确保Realm有机会拦截对属性的访问,从而使Realm有可能从磁盘上的文件中读取/写入数据。省略这个修饰符会导致Swift编译器直接访问实例变量,从而将Realm从循环中删除。
动态
告诉运行时对修改的函数或变量使用动态调度而不是静态调度
将@objc属性隐式添加到变量或函数声明中。
任何使用dynamic关键字的东西都使用Objective-C运行时而不是Swift运行时来向其发送消息
动态对于应用程序分析情况很有用,但牺牲了静态调度提供的优化。
动态调度增加了与Objective-C运行时函数(如依赖KVC/KVO的Core Data(的更好互操作性。
来自Swift语言参考
将此修饰符应用于可以表示的类的任何成员Objective-C。使用动态标记成员声明时修饰符,对该成员的访问总是使用Objective-C运行时。对该成员的访问从不内联,或者被编译器利用了机会。