制作王国& Unbox玩得很好

时间:2016-06-09 19:25:08

标签: swift realm unboxing

我正在学习解析Swift中的JSON,来自Android / Java,而我正在使用John Sundell的Unbox来帮助我解决这个问题,这让我想起了GSON。 参考:Unbox pod

我使用Realm作为数据库来本地存储数据。 参考:Realm.io

找到一个用JSON解析类并将其保存到Realm的工作流程会很棒。我不想要一个实现Unboxable的结构和一个实现Object(Realm)的类,因为那时我必须反映这两个。对我目前的项目来说,这不是太多的工作,但它有点难看......

你们有没有尝试过类似的工作流程?

3 个答案:

答案 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"
    }
}