Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 制造领域与技术;打开盒子玩得很好_Swift_Realm_Unboxing - Fatal编程技术网

Swift 制造领域与技术;打开盒子玩得很好

Swift 制造领域与技术;打开盒子玩得很好,swift,realm,unboxing,Swift,Realm,Unboxing,我正在学习用来自Android/Java的Swift解析JSON,我正在使用John Sundell的Unbox来帮助我,这让我想起了GSON。 参考: 我使用领域作为数据库在本地存储数据。 参考: 如果能找到一个工作流,用JSON解析一个类并将其保存到Realm中,那就太好了。我不希望有一个实现Unboxable的结构和一个实现Object(Realm)的类,因为这样我就必须反映这两者。这对我目前的项目来说不是太多的工作,但它有点难看 你们有人尝试过类似的工作流吗?我认为你们不需要两种不同的类

我正在学习用来自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")
    }
}