我想用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相对较新且可以不会马上看到一个明显的解决方案。
答案 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
代替class
,let
代替var
。除非您有特定需要通过引用传递模型和/或需要可变性,否则通常最好在Swift中为模型使用不可变结构。
<强>更新强>
正如@MartinR在评论中建议的那样,你也可以在同一个警卫中检查mustX
:
guard let must1 = dict["must1"], must2 = dict["must2"] else {
return nil
}