Swift4怎么将数据从json保存到一个数组以显示在TableView中?

标签: json Swift
发布时间: 2018/1/2 14:33:00
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我试图将数据从func getCoinData保存到一个数组sympolsCoin和数组sympolsCoin以在我的TableView中使用它
我在同一个ViewController.swift文件里创建这个类:

struct Coin: Decodable {

let symbol : String
let price_usd : String }

在我的视图控制器类中:

var coins = [Coin]()
var sympolsCoin = [String]()
var priceUSDcoin = [String]()

func getCoinData(completion: @escaping () -> ()) {
    let jsonURL = "https://api.coinmarketcap.com/v1/ticker/"
    let url = URL(string: jsonURL)

    URLSession.shared.dataTask(with: url!) { (data, response, error) in

        do {
            self.coins = try JSONDecoder().decode([Coin].self, from: data!)

            for info in self.coins {

                self.sympolsCoin.append(info.symbol)
                self.priceUSDcoin.append(info.price_usd)

                print("\(self.sympolsCoin) : \(self.priceUSDcoin)")

                completion()
            }

        }


        catch {
            print("Error is : \n\(error)")
        }
    }.resume()
}

当我在TableView中使用数组时,我得到的是空表!

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "BitcoinTableViewCell", for: indexPath) as! BitcoinTableViewCell

    cell.coinNameLable.text = sympolsCoin[indexPath.row]
    cell.priceLable.text = priceUSDcoin[indexPath.row]

    return cell

}


解决方法 1:

在ViewController类中创建tableView的Outlet,并给它命名为“tableView”,然后尝试这个代码:

func getCoinData() {
    let jsonURL = "https://api.coinmarketcap.com/v1/ticker/"
    let url = URL(string: jsonURL)

    URLSession.shared.dataTask(with: url!) { (data, response, error) in

        do {
            self.coins = try JSONDecoder().decode([Coin].self, from: data!)

            for info in self.coins {

                self.sympolsCoin.append(info.symbol)
                self.priceUSDcoin.append(info.price_usd)

                print("\(self.sympolsCoin) : \(self.priceUSDcoin)")

                self.tableView.reloadData()
            }

        }

        catch {
            print("Error is : \n\(error)")
        }
  }.resume()
}

在ViewDidLoad中调用这个函数:

override func viewDidLoad() {
    super.viewDidLoad()
    getCoinData()
}


官方微信
官方QQ群
31647020