通过从 Object
继承,可以很容易地将 Realm 与类一起使用。但是我如何将包含多个字段的 struct
保存到 Swift 中的 Realm ?例如
struct DataModel {
var id = 0
var test = "test"
}
我知道文档清楚地说明了受支持的类型。但也许有很好的解决方法,或者 - 甚至更好 - 来自 Realm 的人可以写下关于结构的 future 计划。
最佳答案
我建议您使用协议(protocol)来实现您想要的。
1) 创建您的结构
struct Character {
public let identifier: Int
public let name: String
public let realName: String
}
2) 创建你的 Realm 对象
final class CharacterObject: Object {
dynamic var identifier = 0
dynamic var name = ""
dynamic var realName = ""
override static func primaryKey() -> String? {
return "identifier"
}
}
3) 使用协议(protocol)将我们的结构转换为 Realm 对象
public protocol Persistable {
associatedtype ManagedObject: RealmSwift.Object
init(managedObject: ManagedObject)
func managedObject() -> ManagedObject
}
4) 让你的结构持久化
extension Character: Persistable {
public init(managedObject: CharacterObject) {
identifier = managedObject.identifier
name = managedObject.name
realName = managedObject.realName
}
public func managedObject() -> CharacterObject {
let character = CharacterObject()
character.identifier = identifier
character.name = name
character.realName = realName
return character
}
}
有了这些工具,我们就可以实现持久层的插入方法了。
5) 写入数据的例子
public final class WriteTransaction {
private let realm: Realm
internal init(realm: Realm) {
self.realm = realm
}
public func add<T: Persistable>(_ value: T, update: Bool) {
realm.add(value.managedObject(), update: update)
}
}
// Implement the Container
public final class Container {
private let realm: Realm
public convenience init() throws {
try self.init(realm: Realm())
}
internal init(realm: Realm) {
self.realm = realm
}
public func write(_ block: (WriteTransaction) throws -> Void)
throws {
let transaction = WriteTransaction(realm: realm)
try realm.write {
try block(transaction)
}
}
}
5) 使用魔法!
let character = Character(
identifier: 1000,
name: "Spiderman",
realName: "Peter Parker"
)
let container = try! Container()
try! container.write { transaction in
transaction.add(character)
}
关于swift - 如何快速将结构保存到 Realm ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35060391/