如何使用Swift在Realm中迭代Results



我正在尝试迭代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运行时。对该成员的访问从不内联,或者被编译器利用了机会。

最新更新