什么导致Swift中出现“无法转换类型”错误?

问题描述 投票:-2回答:1

我想调用一个简单的api并返回从服务器返回的JSON结构。我正在使用alamofire来实现这一目标。

这是我的功能

func loginUser(user_name: String, password: String, callBack:(Login) -> Void){
    let parameters: Parameters = ["user_name":  user_name,"password": password];
    let urlString=serverURL+"login.php";
    Alamofire.request(urlString, method: .post, parameters: parameters, encoding: URLEncoding.httpBody)
        .responseJSON { response in
            if let status = response.response?.statusCode {
                switch(status) {
                case 200:
                    guard response.result.isSuccess else {
                        //error handling
                        return
                    }
                    if let login: Login = response.result.value {
                        callBack(login)
                    } else {
                        callBack(Login(user_id: 0, status:0))
                    }
                default:
                    print("HTTP Error : \(status)")
                    callBack(Login(user_id: 0, status:0))
                }
            }
    }
}

struct Login {
  let user_id: Int
  let status: Int
}

此行生成“无法转换类型”错误。

if let login: Login = response.result.value {

我究竟做错了什么?

swift alamofire
1个回答
1
投票

正如mag_zbc评论的response.result.value[String : Any]Array

所以首先你需要将它们转换为相应的类型,比如假设它是[String : Any]你可以如下所示投射它:

if let response = response.result.value as? [String : Any] {
    //here you will get your dictionary
}

接下来你需要做的是你需要从response对象中取出值,你可以通过访问response对象中的键来获取值,如下所示:

let user_id = response["userid_key"] as? Int ?? 0
let status = response["status_key"] as? Int ?? 0

这样你就可以从你的user_id对象中获得statusresponse,然后最后一步将这些数据设置到你的结构中,如下所示:

let login = Login(user_id: user_id, status: status)

现在,您可以使用callBack(login)设置回调

你的最终代码如下:

if let response = response.result.value as? [String : Any] {

    let user_id = response["userid_key"] as? Int ?? 0
    let status = response["status_key"] as? Int ?? 0

    let login = Login(user_id: user_id, status: status)

    callBack(login)
}
© www.soinside.com 2019 - 2024. All rights reserved.