领域关系 returns nil 不应该
Realm relationship returns nil when it shouldn't
class Book: Object {
// (…)
var readingSessions: [ReadingSession] {
return linkingObjects(ReadingSession.self, forProperty: "book")
}
}
class ReadingSession: Object {
// (…)
var book: Book?
var aComputedProperty: Int {
print(self) // Prints ReadingSession { book = Book { (…) } (…) }
print(self.book) // Prints nil
// (…)
}
}
代码几乎说明了一切。如果我从计算的 属性 中打印 self
,它会像我期望的那样在其他属性中打印相关对象。但是,如果我只是尝试获取该对象,它 returns nil
。那应该发生吗?我做错了什么吗?
提前致谢,
丹尼尔
编辑:看来问题实际上与计算属性无关。只是从常规视图控制器调用它给我同样的问题:
let session = ReadingSession()
// (…)
print(session) // This returns every property, including the Book
print(session.book) // This returns nil
不过,这种情况并不总是发生。在我的代码的某些部分,我做了同样的事情并且它按预期工作,在其他部分发生了这种情况。所以我想我只是在某个地方犯了一些愚蠢的错误,但我不知道是什么原因造成的。
let realm = try! Realm()
let sessions = realm.objects(ReadingSession).filter("book = %@", user.selectedBook!).sorted("date")
let session = sessions[indexPath.row]
print(session.book) // prints nil
session.book = user.selectedBook!
print(session.book) // prints the correct book
我不明白!我正在根据 Book
过滤会话。当我打印过滤会话的书时,不应该是 return 我用来过滤它的书吗?但它只有在我再次将它的书 属性 设置为同一本书时才有效!
您必须将 user
属性 声明为 dynamic var
才能使其生效:
class ReadingSession: Object {
dynamic var book: Book?
//...
}
class Book: Object {
// (…)
var readingSessions: [ReadingSession] {
return linkingObjects(ReadingSession.self, forProperty: "book")
}
}
class ReadingSession: Object {
// (…)
var book: Book?
var aComputedProperty: Int {
print(self) // Prints ReadingSession { book = Book { (…) } (…) }
print(self.book) // Prints nil
// (…)
}
}
代码几乎说明了一切。如果我从计算的 属性 中打印 self
,它会像我期望的那样在其他属性中打印相关对象。但是,如果我只是尝试获取该对象,它 returns nil
。那应该发生吗?我做错了什么吗?
提前致谢,
丹尼尔
编辑:看来问题实际上与计算属性无关。只是从常规视图控制器调用它给我同样的问题:
let session = ReadingSession()
// (…)
print(session) // This returns every property, including the Book
print(session.book) // This returns nil
不过,这种情况并不总是发生。在我的代码的某些部分,我做了同样的事情并且它按预期工作,在其他部分发生了这种情况。所以我想我只是在某个地方犯了一些愚蠢的错误,但我不知道是什么原因造成的。
let realm = try! Realm()
let sessions = realm.objects(ReadingSession).filter("book = %@", user.selectedBook!).sorted("date")
let session = sessions[indexPath.row]
print(session.book) // prints nil
session.book = user.selectedBook!
print(session.book) // prints the correct book
我不明白!我正在根据 Book
过滤会话。当我打印过滤会话的书时,不应该是 return 我用来过滤它的书吗?但它只有在我再次将它的书 属性 设置为同一本书时才有效!
您必须将 user
属性 声明为 dynamic var
才能使其生效:
class ReadingSession: Object {
dynamic var book: Book?
//...
}