在Swift中将JSON转换为模型值

时间:2016-09-17 09:59:20

标签: ios swift xcode swift3

在我寻求更多了解Swift的过程中,我正在寻找改进我的应用程序的方法,并注意到我做出假设的一些地方,或许我不应该这样做。

创建新对象时,可以说是“学生”,他们需要名称(String),年龄(Int)和得分({{1} })。我从Float文件中读取这些内容,并将它们放入这样的对象中:

JSON

所以我的问题如下; 1.我应该如何修改我的代码以检查如果某个值不是数字,应该在哪里,变量只变为// note, details is a [String:Any] type let name = details["name"] as! String let age = details["age"] as! Int let score = Float(details["score"]) self.student = Student(name: name, tutor_group: tutor_group, score: score) ,甚至更好? 2.如果词典中的键不存在怎么办? 3.有不同的方法,如果是这样,这是最佳做法吗?

注意我希望尽可能缩短此代码 - 每行的nil / if语句不是我想要的。< / p>

提前非常感谢你!

3 个答案:

答案 0 :(得分:9)

Swift团队提出的解决方案

最近Apple described建议的方法来解决这个问题。

您可以通过这种方式定义Student结构(或类)

struct Student {

    let name: String
    let age: Int
    let score: Float

    init?(json: [String:Any]) {
        guard
            let name = json["name"] as? String,
            let age = json["age"] as? Int,
            let score = json["score"] as? Float
            else { return nil }
        self.name = name
        self.age = age
        self.score = score
    }
}

这种方法的好处

  1. 封装将JSON转换为Student结构本身内的Student的逻辑
  2. 如果JSON不包含有效数据(例如,没有age字段且有效Int),则初始值设定项将失败并返回nil。这意味着无法创建具有缺失字段的Student(这是一件好事),这种情况不会导致崩溃。
  3. 更多

    我上面链接的帖子还描述了一种更高级的方法,其中缺少字段/值会引发异常。但是,如果您不需要记录(或通知调用者)为什么初始化失败,则不需要此。

答案 1 :(得分:4)

  

所以我的问题如下; 1.我应该如何修改我的代码来检查如果一个值不是一个数字,它应该在哪里,变量只是零,甚至更好0? 2.如果词典中的键不存在怎么办? 3.有不同的方法,如果是这样,这是最佳做法吗?

let age = (details["age"] as? Int) ?? 0
  • 在所有情况下,age都会有Int
  • 类型
  • 如果该密钥不存在,details["age"]将返回nilas? Int将返回值Int?的{​​{1}}和 nil合并运算符 nil会将值设置为??
  • 如果类型不是0,则条件广告Int将返回as? Int,并且该值将设置为nil
  • 在预期的情况下,0将具有age中存储的Int值。

对于其他领域:

details["age"]

OR

let name = (details["name"] as? String) ?? ""

// If score is stored as a String
let score = Float(details["score"] as? String ?? "") ?? 0

答案 2 :(得分:1)

您可以使用警卫代替:

<td colspan="{{form.my_field.colspan}}">

谢谢!