菜鸟教程小白 发表于 2022-12-12 12:30:43

ios - Swift 3 - 使用具有空值的结构模型保存 json


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

<pre><code>[
{
    &#34;name&#34;: &#34;Mark E&#34;,
    &#34;categories&#34;: &#34;process&#34;,
    &#34;id&#34;: 1,
    &#34;checkedOut&#34;: null,
    &#34;checkedOutBy&#34;: null
},
{
    &#34;name&#34;: &#34;John&#34;,
    &#34;categories&#34;: null,
    &#34;id&#34;: 2,
    &#34;checkedOut&#34;: null,
    &#34;checkedOutBy&#34;: null
}
]
</code></pre>

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

<pre><code>let task = session.dataTask(with: url) { (data, response, error) in
      var myModel = ()
      if let HTTPResponse = response as? HTTPURLResponse {
            let status = HTTPResponse.statusCode
            if(status == 200) {

                guard let data = data else {
                  print(&#34;No Data!!&#34;)
                  return completion(false, myModel)
                }
                guard let json = try! JSONSerialization.jsonObject(with: data, options: []) as? NSArray else {
                  print(&#34;Not an array&#34;)
                  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()
</code></pre>

<p>这是我的数据模型结构</p>

<pre><code>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[&#34;name&#34;] as? String,
          let id = myModel[&#34;id&#34;] as? Int else {
            return nil
    }

    self.name = author
    self.id = id

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

    if let lastCheckedOut = myModel[&#34;lastCheckedOut&#34;] as? String {
      self.lastCheckedOut = lastCheckedOut
    } else {
      self.lastCheckedOut = &#34;&#34;
    }

    if let lastCheckedOutBy = myModel[&#34;lastCheckedOutBy&#34;] as? String {
      self.lastCheckedOutBy = lastCheckedOutBy
    }else {
      self.lastCheckedOutBy = &#34;&#34;
    }
}
}
</code></pre>

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

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

<p>如果值为 null,那么它只需将空字符 <code>""</code> 分配给该变量,它将添加到 MyModel 对象数组中。 </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>检查特定类型并在失败时分配其他内容的常用方法是 <em>nil 合并运算符</em>:</p>

<pre><code>self.lastCheckedOut = myModel[&#34;lastCheckedOut&#34;] as? String ?? &#34;&#34;
</code></pre>

<p>旁注:考虑 JSON <code>null</code> 被反序列化为 <code>NSNull</code> 而不是 <code>nil</code></p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Swift 3 - 使用具有空值的结构模型保存 json,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/40951659/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/40951659/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Swift 3 - 使用具有空值的结构模型保存 json