我正在学习解析Swift中的JSON,来自Android / Java,而我正在使用John Sundell的Unbox来帮助我解决这个问题,这让我想起了GSON。 参考:Unbox pod
我使用Realm作为数据库来本地存储数据。 参考:Realm.io
找到一个用JSON解析类并将其保存到Realm的工作流程会很棒。我不想要一个实现Unboxable的结构和一个实现Object(Realm)的类,因为那时我必须反映这两个。对我目前的项目来说,这不是太多的工作,但它有点难看......
你们有没有尝试过类似的工作流程?
答案 0 :(得分:1)
我认为你不需要两种不同的类型。我的建议是将对象创建为继承自Realm的Object
类的Swift类,然后使它们符合Unbox提供的Unboxable
协议。 (尽管Unbox&page页面上的示例使用了结构模型,但代码或文档中没有任何内容表明类不起作用。)
Realm模型对象的工作方式与任何其他类一样:除了定义您希望存储在数据库中的对象上的任何属性外,您还可以定义方法和初始化程序,甚至可以指定您希望Realm使用的属性忽视。这允许您创建一个对象,该对象既可以作为Realm模型,也可以作为与Unbox兼容的JSON模型。
答案 1 :(得分:1)
更简洁的方法并不需要覆盖所需的初始化程序(基于Marin Todorov的tweet):
class Car: Object, Unboxable {
dynamic var vendor: String = ""
dynamic var modelName: String = ""
dynamic var electric: Bool = false
required convenience init(unboxer: Unboxer) throws {
self.init()
self.vendor = try unboxer.unbox(key: "vendor")
self.modelName = try unboxer.unbox(key: "modelName")
self.electric = try unboxer.unbox(key: "electric")
}
}
答案 2 :(得分:0)
这是一个适合我的例子:
class ProviderRealm: Object, Unboxable {
dynamic var identifier: String = "demo"
dynamic var name: String?
dynamic var logo: String?
/// Initializer used for unboxing of JSON string
required init(unboxer: Unboxer) throws {
self.identifier = (try? unboxer.unbox(key: "identifier")) ?? "demo"
self.name = try? unboxer.unbox(key: "name")
self.logo = try? unboxer.unbox(key: "logo")
super.init()
}
required init(realm: RLMRealm, schema: RLMObjectSchema) {
super.init(realm: realm, schema: schema)
}
required init() {
super.init()
}
required init(value: Any, schema: RLMSchema) {
super.init(value: value, schema: schema)
}
override static func primaryKey() -> String? {
return "identifier"
}
}