OGeek|极客世界-中国程序员成长平台

标题: ios - Swift 3 - 使用具有空值的结构模型保存 json [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 12:30
标题: ios - Swift 3 - 使用具有空值的结构模型保存 json

我正在使用以 JSON 格式返回数据的 restful web 服务。这是样本数据:

[
{
    "name": "Mark E",
    "categories": "process",
    "id": 1,
    "checkedOut": null,
    "checkedOutBy": null
},
{
    "name": "John",
    "categories": null,
    "id": 2,
    "checkedOut": null,
    "checkedOutBy": null
}
]

我正在使用此代码解析此 json。我也为此创建了结构模型。

let task = session.dataTask(with: url) { (data, response, error) in
        var myModel = [MyModel]()
        if let HTTPResponse = response as? HTTPURLResponse {
            let status = HTTPResponse.statusCode
            if(status == 200) {

                guard let data = data else {
                    print("No Data!!")
                    return completion(false, myModel)
                }
                guard let json = try! JSONSerialization.jsonObject(with: data, options: []) as? NSArray else {
                    print("Not an array")
                    return completion(false, myModel)
                }

                for jsondata in json {
                    guard let newdata = MyModel(json: jsondata) else {
                        continue
                    }
                    myModel.append(newdata)
                }
                completion(true,myModel)
            }else {
                completion(false,myModel)
            }
        }
    }
    task.resume()

这是我的数据模型结构

struct MyModel {
var name : String
var categories : String
var id : Int
var checkedOut : String
var checkedOutBy : String

init?(json:Any) {
    guard let myModel = json as? NSDictionary else {
        return nil
    }

    guard let name = myModel["name"] as? String,
          let id = myModel["id"] as? Int else {
            return nil
    }

    self.name = author
    self.id = id

   // This is how I am handling the null values. 
   if let categories = myModel["categories"] as? String {
        self.categories = categories
    } else {
        self.categories = ""
    }

    if let lastCheckedOut = myModel["lastCheckedOut"] as? String {
        self.lastCheckedOut = lastCheckedOut
    } else {
        self.lastCheckedOut = ""
    }

    if let lastCheckedOutBy = myModel["lastCheckedOutBy"] as? String {
        self.lastCheckedOutBy = lastCheckedOutBy
    }else {
        self.lastCheckedOutBy = ""
    }
  }
}

struct MyModel 中,我使用 if let 来检查空值。谁能建议我这是检查每个变量是否为空的正确方法?有没有其他方法可以做到这一点?

如果我使用 guard 检查空值,它不会将任何对象添加到数组中。

如果值为 null,那么它只需将空字符 "" 分配给该变量,它将添加到 MyModel 对象数组中。



Best Answer-推荐答案


检查特定类型并在失败时分配其他内容的常用方法是 nil 合并运算符:

self.lastCheckedOut = myModel["lastCheckedOut"] as? String ?? ""

旁注:考虑 JSON null 被反序列化为 NSNull 而不是 nil

关于ios - Swift 3 - 使用具有空值的结构模型保存 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40951659/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4