是啥导致了 Swift 中的“无法转换类型”错误?
Posted
技术标签:
【中文标题】是啥导致了 Swift 中的“无法转换类型”错误?【英文标题】:What is causing this "Cannot convert type" error in Swift?是什么导致了 Swift 中的“无法转换类型”错误? 【发布时间】:2019-02-22 13:09:19 【问题描述】:我想调用一个简单的 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
我做错了什么?
【问题讨论】:
response.result.value
要么是 [String : Any]
要么是 Array
,你不能只将它转换为 Login
类型并期望它工作
@mag_zbc 我已经添加了登录结构,我该如何让它工作?
【参考方案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
这样您将从您的response
对象中获得user_id
和status
,然后最后一步是将这些数据设置到您的结构中,如下所示:
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)
【讨论】:
以上是关于是啥导致了 Swift 中的“无法转换类型”错误?的主要内容,如果未能解决你的问题,请参考以下文章
Swift4 中的 RxCocoa 映射可选错误,带有“无法转换类型“字符串?”的值
ParseSwift.initialize 显示无法转换类型错误的值
Swift错误无法转换类型'(AFHTTPRequestOperation?,AnyObject?)->()的值
Swift 3 RKObjectRequestOperation 返回错误无法转换类型为 RKObjectRequestOperation