0

我想从 Realm 0.98 迁移到 1.0.2,但我LinkingObjects在继承中遇到了困难。我不能linkingObjects像以前那样覆盖该属性。

Person简化了我的模型存在petscatsCat是的子类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
        }
    }
}

我因为linkingObjects在 getter 中使用,所以我可以轻松覆盖它以将属性从 更改"pets""cats"

现在因为 1.0 使用LinkingObjectslinkingObjects是不同的,例如这里描述的

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属性?

4

2 回答 2

2

如何更改/覆盖用于类LinkingObjects中的Cat属性?

简短的回答是,您不能更改用于 a 的属性LinkingObjects。如果您希望子类LinkingObjects从不同的属性公开,您需要声明一个的 type 属性LinkingObjects,并使用它来代替。

于 2016-08-29T18:56:40.590 回答
-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 }
}
于 2016-10-05T16:26:37.483 回答