【问题标题】:How to override LinkingObjects in Realm 1.0如何在 Realm 1.0 中覆盖 LinkingObjects
【发布时间】:2016-08-26 08:22:45
【问题描述】:

我想从 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
        }
    }
}

因为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 类中用于LinkingObjects 的属性?

【问题讨论】:

    标签: inheritance realm realm-migration


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-10
        • 1970-01-01
        • 2018-07-11
        • 1970-01-01
        • 2020-05-11
        • 2016-05-22
        • 2012-12-17
        相关资源
        最近更新 更多