【问题标题】:How to iterate over Results in Realm with Swift如何使用 Swift 迭代 Realm 中的结果
【发布时间】:2016-08-06 17:16:31
【问题描述】:

我正在尝试迭代 Swift 2 中 Realm 查询的结果。存储了两个 PersonClass 对象。

查询的结果变量是有效的并且包含两个 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   
  }
}

【问题讨论】:

    标签: swift realm


    【解决方案1】:

    问题是您在模型类的属性声明中省略了dynamic 修饰符。 dynamic 修饰符是必要的,以确保 Realm 有机会拦截对属性的访问,使 Realm 有机会从磁盘上的文件中读取/写入数据。省略这个修饰符会导致 Swift 编译器直接访问实例变量,从而将 Realm 排除在循环之外。

    【讨论】:

    • 谢谢。非常明确的答案。由于您为我指明了正确的方向,因此我添加了一个带有附加信息的答案以供将来参考。
    【解决方案2】:

    动态

    告诉运行时对修改的函数或变量使用动态调度而不是静态调度

    将@objc 属性隐式添加到变量或函数声明中。

    任何使用 dynamic 关键字的东西都使用 Objective-C 运行时而不是 Swift 运行时来向其分派消息。

    动态对于应用分析情况很有用,但牺牲了静态调度提供的优化。

    动态调度增加了与依赖 KVC/KVO 的 Core Data 等 Objective-C 运行时函数的更好互操作性。

    来自 Swift 语言参考

    将此修饰符应用于可以表示的类的任何成员 通过 Objective-C。当您使用动态标记成员声明时 修饰符,对该成员的访问总是使用动态调度 Objective-C 运行时。对该成员的访问永远不会内联或 由编译器去虚拟化。

    【讨论】:

      猜你喜欢
      • 2018-08-21
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多