0

我正在尝试使用从 Web API 检索到的 JSON 数据填充 tableview。

我的用户模型有一个类:

class UserModel {
    var userID: String?
    var fullName: String?
    var emailAddr: String?

    init(userID: String?, fullName: String?, emailAddr: String?) {
        self.userID = userID
        self.fullName = fullName
        self.emailAddr = emailAddr
    }
}

我正在尝试填充:

func getUserList(){        
    Alamofire.request("myURL here")
        .responseJSON(completionHandler: { (response) in
            switch response.result {
            case .success(let value):
                ProgressHUD.dismiss()
                let json = JSON(value)
                print(json)

                for (_, _) in json {
                    let user = UserModel(userID: "userID", fullName: "fullName", emailAddr: "email")

                    self.users.append(user)
                }
                self.tableView.reloadData()

                ProgressHUD.dismiss()
            case .failure(let error):
                print(error.localizedDescription)
            }
        })

的输出print(json)是:

[{"userID":"bbloggs","fullName":"Billy Bloggs","email":"bbloggs@bloggs.com"},{"userID":"bnomates","fullName":"Billy Nomates", “电子邮件”:“bnomates@something.org”}]

代码没有进入'for'块并直接跳转到该self.tableView.reloadData行。

4

2 回答 2

0

您可以将结果转换为“字典数组”,然后创建对象。像这样的东西:

func getUserList(){
    Alamofire.request("myURL here")
        .responseJSON(completionHandler: { (response) in
            switch response.result {
            case .success(let value):
                ProgressHUD.dismiss()
                let json = JSON(value)
                print(json)

                if let jsonArray = json as? [[String: Any]] {
                    let user = UserModel(userID: "userID", fullName: "fullName", emailAddr: "email")
                    self.users.append(user)
                }
                self.tableView.reloadData()

                ProgressHUD.dismiss()
            case .failure(let error):
                print(error.localizedDescription)
            }
        })
于 2019-09-13T18:17:30.900 回答
0

实际上你不需要 SwiftyJSON 转换,因为结果已经是一个数组

guard let userArray = value as? [[String:String]] else { return }
for item in userArray {
    let user = UserModel(userID: item["userID"]!, 
                         fullName: item["fullName"]!, 
                         emailAddr: item["email"]!)
    self.users.append(user)
}

但是,我们鼓励您放弃SwiftyJSON并使用Decodable. 它更高效,需要更少的代码

struct User {
    let userID, fullName, emailAddr: String
}

func getUserList() {        
    Alamofire.request("myURL here")
        .responseData(completionHandler: { (response) in // responseData is crucial
            switch response.result {
            case .success(let data):
                ProgressHUD.dismiss()
                do {
                   self.users = try JSONDecoder().decode([User].self, from: data)
                } catch { print(error) }
                self.tableView.reloadData()

                ProgressHUD.dismiss()
            case .failure(let error):
                print(error.localizedDescription)
            }
        })
}
于 2019-09-12T17:22:47.727 回答