【问题标题】:Swift: Realm error at init "NULL is not supported as an RLMObject property". But I don't have a NULLSwift:初始化时的领域错误“不支持将 NULL 作为 RLMObject 属性”。但我没有 NULL
【发布时间】:2014-10-21 13:00:58
【问题描述】:

似乎大多数出现此错误的人都在尝试创建空字符串。我只有三个属性

dynamic var babyEvent: Int
dynamic var eventDate: NSDate
dynamic var timeSpent: Int

在init()中初始化为

override init()
{
    self.babyEvent = BabyWet
    self.eventDate = NSDate()
    self.timeSpent = 5
    super.init()
}

但是当 super.init() 被调用时,我得到了 不支持将“(null)”作为 RLMObject 属性。

有两个 Ints 和一个 NSDate,它们都是有效的 Realm 属性类型。那么为什么会出现这个错误呢?

【问题讨论】:

  • 在大多数 OO 语言中,超级调用通常应该总是首先被调用。 super.init() 是否需要任何数据?
  • 我也是这么认为的,但是首先调用 super.init() 会导致编译时错误。 “属性”在 super.init() 调用时未初始化。
  • @user3427079 Swift 不同,在所有本地属性都初始化之前,您不能调用初始化程序,因此在本地属性设置好值后调用 super。
  • 也许超级需要一些东西来初始化?像 super.init(expectedData)。难道没有API可以检查是否有默认构造函数吗?
  • 谢谢风衣。这东西看起来很酷。

标签: swift properties realm


【解决方案1】:

Realm 不支持没有原始值的 Swift 枚举。但是将原始类型添​​加到 BabyEvent 枚举并将原始值分配给您的领域对象是可行的:

enum BabyEvent: Int {
  case BabyWet, case BabyDry
}
class MyRealmObject: RLMObject {
  dynamic var babyEvent = BabyEvent.BabyWet.rawValue
  dynamic var eventDate = NSDate()
  dynamic var timeSpent = 0
}

【讨论】:

    【解决方案2】:

    在 Swift 中枚举有一个特定的类型。因此,当您认为您正在为 BabyWet 传递一个 Int 时,您实际上是在传递该特定类型的东西。

    您似乎有一个用于 BabyEvent 的 Enum,所以您真的应该看看 rawValue 属性:

    self.babyEvent = BabyWet.rawValue
    

    【讨论】:

    • BabyWet 被定义为“让 BabyWet = 1” 我曾经有一个枚举,它被 Realm 早期调用为无效的 Realm 类型,所以我改变了它。目前 BabyWet 没有我可以使用的 rawValue 属性。
    【解决方案3】:

    正如我所写,您可以在模型定义中设置起始值:

    class TestClass: RLMObject {
        dynamic var babyEvent: Int = 1
        dynamic var eventDate: NSDate = NSDate()
        dynamic var timeSpent: Int = 5    
    }
    

    但这也适用于我:

    class TestClass: RLMObject {
        dynamic var babyEvent: Int
        dynamic var eventDate: NSDate
        dynamic var timeSpent: Int
    
        override init() {
            babyEvent = 1
            eventDate = NSDate()
            timeSpent = 5
            super.init()
        }
    }
    

    在这两种情况下我都简单地使用

    let realm = RLMRealm.defaultRealm()
    
    var myTestObject = TestClass()
    
    realm.beginWriteTransaction()
    realm.addObject(myTestObject)
    realm.commitWriteTransaction()
    

    创建对象并将其添加到领域。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      相关资源
      最近更新 更多