我想调用一个简单的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 {
我究竟做错了什么?
正如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
对象中获得status
和response
,然后最后一步将这些数据设置到你的结构中,如下所示:
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)
}