Swift 制造领域与技术;打开盒子玩得很好
我正在学习用来自Android/Java的Swift解析JSON,我正在使用John Sundell的Unbox来帮助我,这让我想起了GSON。 参考: 我使用领域作为数据库在本地存储数据。 参考: 如果能找到一个工作流,用JSON解析一个类并将其保存到Realm中,那就太好了。我不希望有一个实现Unboxable的结构和一个实现Object(Realm)的类,因为这样我就必须反映这两者。这对我目前的项目来说不是太多的工作,但它有点难看Swift 制造领域与技术;打开盒子玩得很好,swift,realm,unboxing,Swift,Realm,Unboxing,我正在学习用来自Android/Java的Swift解析JSON,我正在使用John Sundell的Unbox来帮助我,这让我想起了GSON。 参考: 我使用领域作为数据库在本地存储数据。 参考: 如果能找到一个工作流,用JSON解析一个类并将其保存到Realm中,那就太好了。我不希望有一个实现Unboxable的结构和一个实现Object(Realm)的类,因为这样我就必须反映这两者。这对我目前的项目来说不是太多的工作,但它有点难看 你们有人尝试过类似的工作流吗?我认为你们不需要两种不同的类
你们有人尝试过类似的工作流吗?我认为你们不需要两种不同的类型。我的建议是将对象创建为Swift类,这些类继承自Realm的
对象
类,然后将它们与Unbox提供的Unboxable
协议相一致。(尽管Unbox页面上的示例使用结构模型,但代码或文档中没有任何内容表明类不起作用。)
领域模型对象的工作方式与任何其他类一样:除了定义要存储在数据库中的对象的任何属性外,还可以定义方法和初始值设定项,甚至指定希望领域忽略的属性。这允许您创建一个对象,既可以作为领域模型,也可以作为与Unbox兼容的JSON模型。下面是一个非常适合我的示例:
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"
}
}
一种更简洁的方法,不需要覆盖所需的初始值设定项(基于Marin Todorov的A):
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")
}
}