我正在与一家非盈利组织合作,帮助他们为自己的网站开发移动应用程序(因此他们为我提供了后端服务等)
他们的登录PHP服务接受JSON中的数据,并以JSON数据的形式返回true或false值,但我在Swift中处理响应时遇到问题。我正在使用Alamofire连接到HTTP服务。
我附上了我的代码以及我在下面收到的异常消息,真的很感激一些帮助
func authenticateUser (un: String, pw: String) -> Bool
{
var checker = false
let jsonDict : [String: String] = ["volunteer_email": un, "volunteer_pass": pw]
Alamofire.request("www.sampleurl.com/login.php", method: .post, parameters: jsonDict, encoding: JSONEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in
switch(response.result) {
case .success(_):
if response.result.value != nil{
print (response.result.value)
let resp = response.result.value as! NSDictionary
let results = resp["status"] as! [[String:Any]]
//Change the boolean value of checker based on the value of the results constant
print (results)
}
break
case .failure(_):
print(response.result.error)
break
}
}
return checker;
}
日志:
可选(&lt; __ NSSingleObjectArrayI 0x600000009b50&gt;({ status = false; }))无法转换类型&#39; __ NSSingleObjectArrayI&#39;的值(0x10e28c528)到&#39; NSDictionary&#39; (0x10e28d1a8)。 2018-05-09 12:13:00.177091 + 0530 TestApp1 [16680:817883] 无法转换类型&#39; __ NSSingleObjectArrayI&#39;的值(0x10e28c528)来 &#39;的NSDictionary&#39; (0x10e28d1a8)。 (LLDB)
记录response.result.value:
注意:&#34;状态&#34;:&#34; false&#34; /&#34; true&#34;是Web服务的输出
可选(&lt; __ NSSingleObjectArrayI 0x60400001b160&gt;( { status = false; } ))
注意:我做了一些研究,我理解了NSSingleObjectArray是什么以及它是什么导致它,但是我被困在这里,因为服务只将一个JSON值传回给我的应用程序。有没有办法处理这个没有要求组织更改他们的代码?从逻辑上讲,我不应该将响应转换为NSDictionary,无论其大小如何?
另外,我之所以指定返回的数据可以是any类型,是因为我遇到了一个问题,可以在这里找到:
提前非常感谢:)
答案 0 :(得分:2)
由于您正在使用Alamofire的.responseJSON
,因此您应该使用Alamofire的参数化枚举。它在.success
中提供了json对象。所以做case .success(_)
是浪费的。
继续这样做,根本不需要进行类型转换response.result.value
。
Alamofire
.request("www.sampleurl.com/login.php",
method: .post,
parameters: jsonDict,
encoding: JSONEncoding.default,
headers: nil)
.responseJSON { (response) in
switch(response.result) {
case .success(let responseJSON):
print(responseJSON)
/*
As an improvement:
To obtain an easy-access object, convert responseJSON to either a:
1. Codable model:
let model = JSONDecoder().decode(SomeModel.self,
from: responseJSONData)
2. SwiftyJSON object: (available on GitHub)
let json = JSON(responseJSON)
Doing so will basically make accessing the inner elements easier.
*/...
case .failure(let error):
print(error)
}
}
BTW,仅供参考:响应是一个字典数组,而不是字典数组的字典。
答案 1 :(得分:0)
使用NSArray代替NSDictionary
func authenticateUser (un: String, pw: String) -> Bool{
var checker = false
let jsonDict : [String: String] = ["volunteer_email": un, "volunteer_pass": pw]
Alamofire.request("www.sampleurl.com/login.php", method: .post, parameters: jsonDict, encoding: JSONEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in
switch(response.result) {
case .success(_):
if response.result.value != nil{
print (response.result.value)
let resp = response.result.value as! NSArray
let results = resp["status"] as! [[String:Any]]
//Change the boolean value of checker based on the value of the results constant
print (results)
}
break
case .failure(_):
print(response.result.error)
break
}
}
return checker;
}