我有一个从mySQL服务器下载数据的数据下载器类。 我遇到的问题是当结果为null时 - 应用程序崩溃并显示错误消息
无法转换类型' __ NSArray0'的值(0x105548918)到' NSMutableArray' (0x105549c00)。
class userDetailsDownloader: NSObject, NSURLSessionDataDelegate {
weak var delegate: getUserDetails!
var data : NSMutableData = NSMutableData()
func downloadUserDetails(userEmail: String) {
let urlPath: String = "http://intouchmobile.co/phpscripts/getuserpassword.php?email=\(userEmail)"
let url: NSURL = NSURL(string: urlPath)!
var session: NSURLSession!
let configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration() //defaultSessionConfiguration()
session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
let task = session.dataTaskWithURL(url)
task.resume()
}
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
self.data.appendData(data);
}
func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
if error != nil
{
print("Failed to get password")
}
else
{
self.parseJSON()
print("Password Received")
}
}
func parseJSON() {
var jsonResult: NSMutableArray = NSMutableArray()
var password: String!
var firstName: String!
var lastName: String!
do{
jsonResult = try NSJSONSerialization.JSONObjectWithData(self.data, options:NSJSONReadingOptions.AllowFragments) as! NSMutableArray
} catch let error as NSError {
print(error)
}
}
答案 0 :(得分:1)
不要说as! NSMutableArray
。术语as!
意味着"让我崩溃",所以当你崩溃时你几乎不会感到惊讶。说as? NSMutableArray
。测试nil
的结果。如果是nil
,请停止。
if let jsonResult = try NSJSONSerialization.JSONObjectWithData(self.data, options:NSJSONReadingOptions.AllowFragments) as? NSMutableArray {
self.jsonResult = jsonResult
}
你可能仍然有问题,因为这永远不会是一个可变阵列;它只是一个阵列。所以您可能需要将其更改为:
if let jsonResult = try NSJSONSerialization.JSONObjectWithData(self.data, options:NSJSONReadingOptions.AllowFragments) as? NSArray {
self.jsonResult = NSMutableArray(array: jsonResult)
}
(但是,正如vadian在评论中所说,如果您可以放弃使用NSArray和NSMutableArray并使用Swift类型,那将会更好。)
答案 1 :(得分:0)
试试这样。
if NSJSONSerialization.isValidJSONObject(data) {
//your do catch
}
这应该可以解决你的问题。