如何在Realm 1.0中覆盖LinkingObjects

时间:2016-08-26 08:22:46

标签: inheritance realm realm-migration

我想从Realm 0.98迁移到1.0.2,但我在继承中使用LinkingObjects。我不能像以前一样覆盖linkingObjects属性。

简化了我的模型,其中Person包含petscatsCatPet的子类(因为它共享了我在这里省略的属性)。在人员的单独列表中处理猫是很重要的。让我们假设它是一个很棒的猫应用程序,也有一些支持其他宠物。

在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使用的属性?

2 个答案:

答案 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 }
}