我想创建一个持久化对象的副本,这样新实例具有所有相同的值但不附加到 Realm。使用 Object(value: persistedInstance)
非常适合属性都是字符串、日期、数字等的类。但是,当复制具有 List 类型属性的类的实例时,副本的 List 和 List 的元素继续引用持久化的记录。我如何创建一个完全脱离 Realm 的副本,包括任何列表和这些列表中的元素?
最佳答案
您可以通过以下扩展函数对您的对象进行深度复制:
import UIKit
import Realm
import RealmSwift
protocol RealmListDetachable {
func detached() -> Self
}
extension List: RealmListDetachable where Element: Object {
func detached() -> List<Element> {
let detached = self.detached
let result = List<Element>()
result.append(objectsIn: detached)
return result
}
}
@objc extension Object {
public func detached() -> Self {
let detached = type(of: self).init()
for property in objectSchema.properties {
guard
property != objectSchema.primaryKeyProperty,
let value = value(forKey: property.name)
else { continue }
if let detachable = value as? Object {
detached.setValue(detachable.detached(), forKey: property.name)
} else if let list = value as? RealmListDetachable {
detached.setValue(list.detached(), forKey: property.name)
} else {
detached.setValue(value, forKey: property.name)
}
}
return detached
}
}
extension Sequence where Iterator.Element: Object {
public var detached: [Element] {
return self.map({ $0.detached() })
}
}
使用
/// in collections
let data = realm.objects(AbcDfg.self).detached
/// single object
data.first?.detached()
关于ios - RealmSwift : Detach an object from Realm, 包括其列表类型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37140430/