如何覆盖 Realm 1.0 中的 LinkingObjects

How to override LinkingObjects in Realm 1.0

我想从 Realm 0.98 迁移到 1.0.2,但我在继承中使用 LinkingObjects 时遇到了困难。我无法像以前那样覆盖 linkingObjects 属性。

简化我的模型存在 Person,其中包含 petscatsCatPet 的子 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,则需要声明类型为 LinkingObjectsnew 属性 ],并改用它。

正如@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 }
}