我想调用一个简单的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 {
我在做什么错了?
答案 0 :(得分: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
对象中获得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)
}