我想从Realm 0.98迁移到1.0.2,但我在继承中使用LinkingObjects
。我不能像以前一样覆盖linkingObjects
属性。
简化了我的模型,其中Person
包含pets
和cats
。 Cat
是Pet
的子类(因为它共享了我在这里省略的属性)。在人员的单独列表中处理猫是很重要的。让我们假设它是一个很棒的猫应用程序,也有一些支持其他宠物。
在0.98中看起来像这样:
class Person: Object {
let pets = List<Pet>()
let cats = List<Cat>()
}
class Pet: Object {
var linkedOwner: Person? {
get {
return linkingObjects(Pet.self, forProperty: "pets").first
}
}
}
class Cat: Pet {
override var linkedOwner: Person? {
get {
return linkingObjects(Cat.self, forProperty: "cats").first
}
}
}
我在getter中使用了linkingObjects
后,我可以轻松覆盖它以将属性从"pets"
更改为"cats"
。
现在,自1.0使用LinkingObjects
代替linkingObjects
后,它就不同了,for example as described here:
class Person: Object {
let pets = List<Pet>()
let cats = List<Cat>()
}
class Pet: Object {
let linkedOwners = LinkingObjects(fromType: Person.self, property: "pets")
var linkedOwner: Person? {
get {
return linkedOwners.first
}
}
}
class Cat: Pet {
// this does not compile: Cannot override with a stored property 'linkedOwners'
override let linkedOwners = LinkingObjects(fromType: Person.self, property: "cats")
// linkedOwner would be the same so we don't need to override anymore
}
如何更改/覆盖LinkingObjects
课程中Cat
使用的属性?
答案 0 :(得分:2)
如何更改/覆盖
LinkingObjects
课程中Cat
使用的属性?
简短的回答是,您无法更改LinkingObjects
使用的属性。如果您希望子类从其他属性公开LinkingObjects
,则您需要声明类型为LinkingObjects
的 new 属性,并使用该属性。
答案 1 :(得分:-1)
正如@bdash提到的那样,旧的方式并不可行。因此,我最终创建了一个新的基类,它提供了一个抽象属性,可以覆盖转发到实际的特定LinkingObjects
属性。
class Person: Object {
let pets = List<Pet>()
let cats = List<Cat>()
}
class Animal: Object {
var linkedOwner : Person? { fatalError("override me!") }
}
class Pet: Animal {
private let linkedOwners = LinkingObjects(fromType: Person.self, property: "pets")
override var linkedOwner: Person? { return linkedOwners.first }
}
class Cat: Animal {
private let linkedOwners = LinkingObjects(fromType: Person.self, property: "cats")
override var linkedOwner: Person? { return linkedOwners.first }
}