领域数据库对象似乎是空的,但事实并非如此

Realm database object seems empty, but then isn't

我正在使用 Realm 进行一个小而简单的项目。我正在使用最新版本的框架(昨天从 Github 编译)和 Xcode 的当前 AppStore 版本 Swift 2.1.

我在 prepareForSegue() 中通过 segue 将一个 Realm 数据库对象从一个视图控制器移交给另一个视图控制器,以便对其进行编辑(并填写当前值)。

不知何故,目标视图控制器中的对象似乎有问题。当我简单地 print() 目标视图控制器中的对象时(在 viewDidLoad() 或我计划在其中使用它的任何方法中),该对象在控制台中正确显示如下:

Object {
name = asdf
value = 8
}

等等。

如果我尝试访问值(即使在上一行或下一行)并将它们分配给另一个变量,如 myValue = objectToEdit.value,我得到 0。

通过使用断点进入代码来调试代码会在调试器中显示所有值为空 ("") 或 0 的对象,具体取决于类型。尽管如此,由于某种原因,字符串还是被从中获取了,我可以使用 myString = objectToEdit.name 访问并打印它们,而调试器显示 name = (String) "",声称它是空的。

当我在第一个视图中从数据库中取出数据库对象时,已经发生了相同的行为。直接的想法是,这些值确实是 0 并且只保存了字符串,但是 print() 方法另有说明。

任何人都可以解释这种奇怪的行为,并告诉我我忽略了什么地方吗?我现在怀疑这是框架的一些内部问题,但我不确定。如果需要,我当然会更新更多代码或回答问题。

您需要 the LLDB plugin 才能在调试代码时看到正确的值。 按照第一个代码注释中的建议安装它,或者只执行下面的脚本:

mkdir -p ~/Library/Application\ Support/Realm
wget -O ~/Library/Application\ Support/Realm/rlm_lldb.py https://raw.githubusercontent.com/realm/realm-cocoa/master/plugin/rlm_lldb.py
touch ~/.lldbinit
grep -q "rlm_lldb.py" ~/.lldbinit || echo "command script import "~/Library/Application Support/Realm/rlm_lldb.py" --allow-reload" >> .lldbinit

当我注意到这些值很奇怪是我在模型定义中输入的 "default" 值时,我发现了问题。

出于某种原因,我没有在某些属性上使用 dynamic 声明,例如:

class myObject: Object {
    dynamic var name = ""
    var value = 0
}

这导致在视图控制器中创建的新对象具有这些标准值,我总是得到 0,但另一方面可以获得正确的字符串。

在变量声明中添加 dynamic 解决了我的问题。

感谢您的回答。