【发布时间】:2018-10-19 05:04:04
【问题描述】:
我正在与一家非营利组织合作,帮助他们为其网站开发移动应用程序(因此他们为我提供了后端服务等)
他们的登录 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;
}
日志:
可选(<__nssingleobjectarrayi>( { 状态=假; } ) ) 无法将“__NSSingleObjectArrayI”(0x10e28c528)类型的值转换为“NSDictionary” (0x10e28d1a8)。 2018-05-09 12:13:00.177091+0530 TestApp1 [16680:817883] 无法将“__NSSingleObjectArrayI”(0x10e28c528)类型的值转换为 'NSDictionary' (0x10e28d1a8)。 (lldb)
result.result.value 的日志:
注意:"status":"false"/"true" 是网络服务的输出
可选(<__nssingleobjectarrayi>( { 状态=假; } ))
注意:我做了一些研究,了解 NSSingleObjectArray 是什么以及导致它的原因,但我被困在这里,因为该服务只将一个 JSON 值传回我的应用程序。有没有办法在不要求组织更改代码的情况下处理这个问题?从逻辑上讲,我是否应该能够将响应转换为 NSDictionary 而不管其大小?
另外,我之所以指定返回的数据可以是 any 类型,是因为我遇到了一个可以在这里找到的问题:
提前非常感谢:)
【问题讨论】:
-
这是斯威夫特。不要使用
NSDictionary或其他 Objective-C 集合类型。 -
尝试将这一行
let resp = response.result.value as! NSDictionary编辑为let resp = response.result.value as! NSArray -
@a.masri 不要使用
NSArray。使用 Swift 数组。并避免强制施法。安全施放。 -
用github.com/SwiftyJSON/SwiftyJSON搭配alamofire,很有用
-
@ShubhamNaik 如果有人无法区分 JSON 数组和字典,则解析工具无关紧要。