好的,首先,我知道没有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/