忽略属性和简单的swift属性

时间:2017-08-21 09:46:06

标签: ios swift properties realm

使用忽略的属性和使用简单的swift属性的行为有什么不同?

我需要向不应保存到DB的realm对象添加属性。 Realm提供了“忽略的属性”,但是如果我只是用普通的swift样式编写属性,它就不应该保存到DB。行为有区别吗?

// Ignored propery
class Person: Object {
  dynamic var tmpID = 0

  override static func ignoredProperties() -> [String] {
    return ["tmpID"]
  }
}


// Normal swift property
class Person: Object {
      var tmpID = 0 // Realm supported class but with no dynamic
      var myClassObj = MyCustomClass() // Class realm does not support
 }

3 个答案:

答案 0 :(得分:2)

可能有其他原因以Realm方式执行并使用ignoredProperties,但我看到的一个问题如下:

Realm是一个C ++项目,上面是一个Objective-C层,最重要的是Swift层。我想有一天可能会删除Objective-C层。 如果在那天之后升级数据库,那么所有简单的swift属性都将成为数据库条目,因为dynamic告诉编译器使用Objective-C动态分派。如果他们删除Objective-C图层,则不再需要dynamic。所以请保存并使用ignoredProperties

答案 1 :(得分:2)

由于Realm框架中使用的Objective-C运行时,必须将Realm模型中的var属性标记为dynamic。如果您不将属性标记为dynamic,则不会在运行时更新它们。

然而,ignoredProperties是完全独立的事情。通过向ignoredProperties添加属性,您可以告诉Realm不要在数据库中保留该属性。如果您未将某个属性标记为dynamic并且未将其添加到ignoredProperties,则仍会将其保留到Realm,但它不会按预期工作

如果您需要在Realm模型类中存储不持久的属性,则必须将它们添加到ignoredProperties

答案 2 :(得分:1)

您似乎将ignoredProperties与这两件事进行比较

  • 没有dynamic
  • 的快速属性
  • 属于Realm
  • 不支持类型的属性

对于第一种,Realm似乎仍然将它们存储在数据库中。

class MyObject: Object {
    dynamic var string = ""
    var normalString = ""
}

数据库:

enter image description here

这是因为dynamic只是告诉swift在Objective-C运行时使用动态分派的一种方法,它允许在运行时动态更新属性。

对于第二种,Realm似乎忽略了不是Realm Object s的自定义类。