Как использовать swiftyJson для получения значения массива в TableView? - PullRequest
0 голосов
/ 27 августа 2018

Я использую 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)")
            }
        })
    }
}

Из cellForRowAt в tableView он показывает «неоднозначное использование« нижнего индекса »с приведенным ниже кодом, понятия не имею, как его решить.Остальные, такие как «name», «hp» и «subtype», не являются проблемой!

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

Может кто-нибудь помочь мне с этой ошибкой?Спасибо!

1 Ответ

0 голосов
/ 27 августа 2018

Компилятор должен знать тип любого подписанного объекта.Сообщите компилятору, что вы ожидаете массив строк.

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

В Swift 3+ все значения JSON Any не AnyObject, поэтому объявите массив

var pokamon = [[String:Any]]()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...