菜鸟教程小白 发表于 2022-12-11 20:22:29

ios - 使用 JSONDecoder 后如何正确调用属性


                                            <p><p>我正在解码 JSON,然后我创建了一个 completionHandler 函数,以便能够在项目中的任何位置获取 JSON 解析的属性。但是,当我调用该函数并只打印我想要的属性时,我将它们全部放在一起而不是调用的属性。 </p>

<p>例如:我调用 beer.name,所以当我打印出来时,我得到了解码后的 Struct 中包含的所有属性和值。我究竟做错了什么?我需要将这些值分开,以便能够填充 UITableView 和其他组件。</p>

<p><strong><em> ViewController </em></strong></p>

<pre><code> override func viewDidLoad() {
      super.viewDidLoad()

      getApiData { (cerveja) in
            for beer in cerveja {
                print(beer.name!)
            }
      }
    }
</code></pre>

<blockquote>
<p>That&#39;s what I got for this call below:</p>
</blockquote>

<pre><code>
</code></pre>

<p><em>我确实需要的是所有名称或 abv 或 image_url 的</em> </p>

<p><strong><em>模型文件夹:</em></strong></p>

<pre><code>struct Cerveja:Decodable{
    let name:String?
    let abv:Double
    let image_url:String
}
</code></pre>

<p><strong><em>网络文件夹:</em></strong></p>

<pre><code>func getApiData(completion: @escaping () -&gt; ()){
    guard let urlString = URL(string: &#34;https://api.punkapi.com/v2/beers&#34;) else {
      print(&#34;URL Error&#34;)
      return
    }
    Alamofire.request(urlString).responseJSON { response in

      if response.data == response.data{
            do{
                let decoder = try JSONDecoder().decode(.self, from: response.data!)
                print(decoder)
            }catch{
      print(error)
            }
      }else{print(&#34;API Response is Empty&#34;)}

      }
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>实际上,您正在打印“解码器”。你必须这样写:</p>

<pre><code>func getApiData(completion: @escaping () -&gt; ()){
guard let urlString = URL(string: &#34;https://api.punkapi.com/v2/beers&#34;) else {
    print(&#34;URL Error&#34;)
    return
}
Alamofire.request(urlString).responseJSON { response in

    if let data = response.data{
      do{
            let decoder = try JSONDecoder().decode(.self, from: data)
            completion(decoder)
      }catch{
    print(error)
      }
    }else{print(&#34;API Response is Empty&#34;)}

    }
</code></pre>

<p>}</p>

<p>避免你强制解包。所以用</p>

<pre><code>if let data = response.data{
   // Some code
}
</code></pre>

<p>然后就可以在viewDidLoad()中打印了</p>

<pre><code> override func viewDidLoad() {
    super.viewDidLoad()

    getApiData { (cerveja) in
      for beer in cerveja {
            print(beer.name!)
      }
    }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用 JSONDecoder 后如何正确调用属性,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/51387145/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/51387145/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用 JSONDecoder 后如何正确调用属性