如何使用swiftyJson在TableView中获取arrayvalue?

时间:2018-08-27 06:42:21

标签: swift

我使用swiftyJson解析数据,但是不知道如何解析数组。 这是代码。

import UIKit
import Alamofire
import SwiftyJSON

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    var json:JSON = JSON.null
    var urlSession = URLSession(configuration: .default)
    @IBOutlet weak var myTableView: UITableView!
    var pokamon = [[String:AnyObject]]()

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return pokamon.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
        var dict = pokamon[indexPath.row]
        cell.nameLbl.text = dict["name"] as? String
        cell.typesLbl.text = dict["types"]?[0] as? String
        cell.hpLbl.text = dict["hp"] as? String
        cell.subtypeLbl.text = dict["subtype"] as? String

        if let image = URL(string: dict["imageUrl"] as! String){
            let task = urlSession.downloadTask(with: image) { (url, repsponse, error) in
                if error != nil{
                    print("sorry")
                    return
                }
                if let okURL = url{
                    do{
                        let downloadImage = UIImage(data: try Data(contentsOf: okURL))
                        DispatchQueue.main.async {
                            cell.myImage.image = downloadImage
                        }
                    }catch{
                        print("error")
                    }
                }
            }
            task.resume()
        }
        return cell
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 224
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        myTableView.delegate = self
        myTableView.dataSource = self

        Alamofire.request("https://api.pokemontcg.io/v1/cards").responseJSON(completionHandler: { response in

            if response.result.isSuccess {

                let json:JSON = try! JSON(data: response.data!)
                let swiftyJsonVar = JSON(response.result.value!)
                if let resData = swiftyJsonVar["cards"].arrayObject{
                    self.pokamon = resData as! [[String:AnyObject]]
                }
                if self.pokamon.count > 0{
                    self.myTableView.reloadData()
                }
            } else {
                print("error: \(response.error)")
            }
        })
    }
}

在tableView的cellForRowAt中,它用以下代码显示“'subscript'的模糊使用”,不知道如何解决。其余的“名称”,“ hp”和“子类型”都没问题!

cell.typesLbl.text = dict["types"]?[0] as? String

有人可以帮助我解决此错误吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

编译器必须知道任何下标对象的类型。告诉编译器您期望一个字符串数组。

cell.typesLbl.text = (dict["types"] as? [String])?.first

在Swift 3+中,所有JSON值均为Any而非AnyObject,因此请声明数组

var pokamon = [[String:Any]]()