如何覆盖 Realm 1.0 中的 LinkingObjects
How to override LinkingObjects in Realm 1.0
我想从 Realm 0.98 迁移到 1.0.2,但我在继承中使用 LinkingObjects
时遇到了困难。我无法像以前那样覆盖 linkingObjects
属性。
简化我的模型存在 Person
,其中包含 pets
和 cats
。 Cat
是 Pet
的子 class(因为它共享我在此处省略的属性)。在 persons 的单独列表中处理 cats 很重要。让我们假设它是一个很棒的猫应用程序,也有一些对其他宠物的支持。
在 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
}
}
}
我因为 linkingObjects
在 getter 中使用,所以我可以轻松地覆盖它以将 属性 从 "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
}
如何更改/覆盖 Cat
class 中用于 LinkingObjects
的 属性?
How can I change / override the property used for the LinkingObjects
in the Cat
class?
简短的回答是,您无法更改用于 LinkingObjects
的 属性。如果您希望子类从不同的 属性 中公开 LinkingObjects
,则需要声明类型为 LinkingObjects
的 new 属性 ],并改用它。
正如@bdash 提到的那样,旧方法不可行。因此,我最终创建了一个新的基础 class,它提供了一个抽象 属性,可以通过转发到实际的特定 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 }
}
我想从 Realm 0.98 迁移到 1.0.2,但我在继承中使用 LinkingObjects
时遇到了困难。我无法像以前那样覆盖 linkingObjects
属性。
简化我的模型存在 Person
,其中包含 pets
和 cats
。 Cat
是 Pet
的子 class(因为它共享我在此处省略的属性)。在 persons 的单独列表中处理 cats 很重要。让我们假设它是一个很棒的猫应用程序,也有一些对其他宠物的支持。
在 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
}
}
}
我因为 linkingObjects
在 getter 中使用,所以我可以轻松地覆盖它以将 属性 从 "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
}
如何更改/覆盖 Cat
class 中用于 LinkingObjects
的 属性?
How can I change / override the property used for the
LinkingObjects
in theCat
class?
简短的回答是,您无法更改用于 LinkingObjects
的 属性。如果您希望子类从不同的 属性 中公开 LinkingObjects
,则需要声明类型为 LinkingObjects
的 new 属性 ],并改用它。
正如@bdash 提到的那样,旧方法不可行。因此,我最终创建了一个新的基础 class,它提供了一个抽象 属性,可以通过转发到实际的特定 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 }
}