ios - 如何在 Swift 中创建一个 List<AnyRealmObject>?

标签 ios swift realm

好的,首先,我知道没有AnyRealmObject这样的东西。 .

但我需要有一些行为就像 Realm 一样的东西 List , 除了任何种类的 Realm Object可以添加到列表中——它们不必都是同一类型。

目前,我有这样的东西:

enter code here
class Family: Object {
   var pets: List<Pet>
}

class Pet: Object {
    var dog: Dog?
    var cat: Cat?
    var rabbit: Rabbit?
}

目前,如果我想添加,比如说,Bird , 我必须修改 Pet目的。我不想继续修改那个类。

我真正想做的是:

class Family: Object {
  var pets: List<Object>
}

或者,也许,定义一个 Pet协议(protocol),它必须是一个对象,并且有 var pets: List<Pet>

关键是,我想要一个可以包含我传递给它的任何 Realm 对象的数据包。数据包的唯一要求是对象必须是 Realm 对象。

现在,既然 Realm 不允许这样做,我怎么能这样做呢?我正在考虑创建类似 Realm 的东西 ObjectReference类:

class ObjectReference: Object {
   var className: String
   var primaryKeyValue: String

   public init(with object: Object) {
      className = ???
      primaryKeyValue = ???
   }

   public func object() -> Object? {
      guard let realm = realm else { return nil }
      var type = ???
      var primaryKey: AnyObject = ???
      return realm.object(ofType: type, forPrimaryKey: primaryKey)(
   }
}

带有 ??? 的东西这就是我要问的。如果有更好的方法可以做到这一点,我会洗耳恭听。我觉得我的方法还可以,就是不知道怎么填空,这里。

最佳答案

(我假设您正在编写一个应用程序,并且您提供的代码示例和问题的上下文是关于应用程序代码的,而不是创建一个库。)

鉴于 Realm 当前的局限性,您的方法似乎是一种不错的方法;我想不出比这更好的事情了。您可以使用 NSClassFromString() 将您的 className 字符串转换为可以与 object(ofType:...) 一起使用的 Swift 元类对象应用程序接口(interface):

public func object() -> Object? {
    let applicationName = // (application name goes here)

    guard let realm = realm else { return nil }
    guard let type = NSClassFromString("\(applicationName).\(className)") as? Object.Type else {
        print("Error: \(className) isn't the name of a Realm class.")
        return nil
    }
    var primaryKey: String = primaryKeyValue
    return realm.object(ofType: type, forPrimaryKey: primaryKey)(
}

我的建议是让事情保持简单,只使用字符串作为主键。如果你真的需要能够使用任意类型作为主键,你可以看看我们的 dynamic API有关如何提取给定对象的主键值的想法。 (请注意,虽然此 API 在技术上是一个公共(public) API,但我们通常不为其提供支持,也不鼓励使用它,除非类型化 API 不合适。)

在未来,我们希望为子类化和多态性提供增强的支持。根据此功能的设计方式,它可能允许我们引入 API 以允许将父对象类型的子类插入到列表中(尽管这构成了它的 own problems )。

关于ios - 如何在 Swift 中创建一个 List<AnyRealmObject>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46626800/

相关文章:

ios - 如何正确地将对象从一个 Realm 对象复制到另一个对象

ios - 如何初始化 Realm 数据库

swift - Realm 迁移 : Migrating objects to another

iphone - 将通用应用程序作为缩放的 iPhone 应用程序运行?

swift - 单元测试找不到要测试的类

class - 在 Swift 中比较一个对象的两个实例

ios - 当带有动画的pushViewcontroller为true时,UINavigationBar立即消失

ios - 应用内购买仍然需要在自己的服务器上验证收据

ios - iPhone - 在 iTunesConnect 上的应用程序有效期结束后,我可以再次使用相同的名称吗?

ios - UIViewController 动画