使用可能不包含所有必需键的字典初始化对象属性(并且在该情况下未通过初始化)

时间:2015-11-26 20:36:11

标签: json swift initialization

我想用JSON字典的内容初始化一个对象。

对象的模型具有强制属性(“必须”;例如名称,id,香蕉数量......)和非强制属性(“可能”;例如描述)。

在初始化期间,JSON字典作为参数传递。如果字典中缺少其中一个必须(即如果密钥不在那里),则初始化应该失败(返回nil)。如果缺少一个或多个maybes(并保留默认值),它应该会成功。

以下是我想要的内容:

class Model {

    var must1:  String = ""
    var must2:  String = ""
    var maybe1: String = "default1"
    var maybe2: String = "default2"

    init?(dict: Dictionary<String,String>) {

        must1 = dict["must1"] //and if not possible return nil
        must2 = dict["must2"] //and if not possible return nil

        maybe1 = dict["maybe1"] //and if not possible ignore
        maybe2 = dict["maybe2"] //and if not possible ignore

    }

}

在真实的项目中,我有更多的属性,我主要是试图避免一个不优雅的解决方案。

我一直在考虑如何将 guard 语句或可选绑定( if if )付诸实践,但我对swift相对较新且可以不会马上看到一个明显的解决方案。

1 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

class Model {

    var must1:  String = ""
    var must2:  String = ""
    var maybe1: String = "default1"
    var maybe2: String = "default2"

    init?(dict: Dictionary<String,String>) {

        guard let must1 = dict["must1"] else {
            return nil
        }        

        guard let must2 = dict["must2"] else {
            return nil
        }

        self.must1 = must1
        self.must2 = must2

        if let maybe1 = dict["maybe1"] {
            self.maybe1 = maybe1
        }

        if let maybe2 = dict["maybe2"] {
            self.maybe2 = maybe2
        }
    }

}

您正在编辑自己的JSON反序列化代码非常好,它将帮助您了解该过程的工作原理。

一旦你有信心,你可能想看看像JSONCodable这样的图书馆,它们会带走所有那些平凡的编码。

作为旁注,我建议您考虑使用struct代替classlet代替var。除非您有特定需要通过引用传递模型和/或需要可变性,否则通常最好在Swift中为模型使用不可变结构。

<强>更新

正如@MartinR在评论中建议的那样,你也可以在同一个警卫中检查mustX

guard let must1 = dict["must1"], must2 = dict["must2"] else {
    return nil
}