swift - 在 Swift 中使 Realm Loop 通用且可重用

标签 swift class generics realm

swift 4、Xcode 9.2

这是我的一些 Realm 类:

class Dog: Object {
  @objc dynamic var id = UUID().uuidString
  @objc dynamic var updated = Date()
  //Other properties...
}

class Cat: Object {
  @objc dynamic var id = UUID().uuidString
  @objc dynamic var updated = Date()
  //Other properties...
}

class Horse: Object {
  @objc dynamic var id = UUID().uuidString
  @objc dynamic var updated = Date()
  //Other properties...
}

假设我有一些这样的代码,我比较两个 Realm 并创建一个具有特定 Dog 类的对象:

let remoteDogs = remoteRealm.objects(Dog.self)

for remoteDog in remoteDogs{
  if let localDog = realm.objects(Dog.self).filter("id = %@",remoteDog.id).first{
    // Update
    if localDog.updated < remoteDog.updated{
      //Remote is newer; replace local with it
      realm.create(Dog.self, value: remoteDog, update:true)
    }
  }
}

这很好用,但我需要在我拥有的一大堆 Realm 类上做同样的事情。所以我试图让它像这样更通用:

let animals = [Dog.self, Cat.self, Horse.self]

for animal in animals{
  let remoteAnimals = remoteRealm.objects(animal)

  for remoteAnimal in remoteAnimals{
    if let localAnimal = realm.objects(animal).filter("id = %@",remoteAnimal.id).first{
      // Update
      if localAnimal.updated < remoteAnimal.updated{
        //Remote is newer; replace local with it
        realm.create(animal, value: remoteAnimal, update:true)
      }
    }
  }
}

这种方法可行,但任何时候我想引用一个对象的属性(比如 remoteAnimal.idremoteAnimal.updated),编译器都会报错,因为它不知道 remoteAnimal 是什么类型的对象。

有没有人做过这样的事情?我有什么想法可以做到这一点,这样我就不必为我的每个 Realm 类一遍又一遍地编写相同的代码了吗?谢谢!

最佳答案

Realm 对象没有id更新。你可以拥有你的狗, Cat 和 Horse 类继承自 Animal 类,该类是 Object 的子类并且具有 idupdated。由于这些属性是在 Animal 上定义的,因此它们将可用于所有子类(狗、猫、马)。

class Animal: Object {
  @objc dynamic var id = UUID().uuidString
  @objc dynamic var updated = Date()
  //Other properties...
}

class Dog: Animal {
  //Other properties...
}

EDIT 你也可以滥用 Objective C 的 NSObject setValue:forKey:按名称设置属性。这是非常草率的打字,不是很好的面向对象设计,但它确实有效。这是一个 Playground :

import UIKit

class A: NSObject {
  @objc var customProperty = 0
}
let a = A()
a.setValue(5, forKey: "customProperty")
print(a.customProperty)

关于swift - 在 Swift 中使 Realm Loop 通用且可重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47662475/

相关文章:

swift - 如何在swift(FCM)中接收数据通知

swift - 如何将数据从一个 View Controller 传递到另一个 View Controller ?

Java 基类引用变量

c++ - 参数化 typedef 可能吗?

java - 带有参数化类的泛型类型的反射查找方法

templates - Swift:静态 "append"到元组类型

swift - 如何在 Swift 中捕获算术溢出错误?

C++ 覆盖基本成员值

c++ - 如何在 C++ 中从父类变量调用子类的重载方法

Java 泛型、单例和静态方法