您的代码不进行任何错误处理。但它可能(如果此数据来自 Web 服务,将会)以多种方式失败。
- 您必须确保您的数据对象确实存在
- 您必须确保数据对象可以转换为 JSON
- 您必须确保 JSON 实际上包含字典
您应该使用 Swift 的条件转换和它的可选绑定功能。
可选绑定 if let JSONData = JSONData 检查 JSONData 是否不为零。如果无法接收到数据,您使用的强制展开 (JSONData!) 可能会崩溃。
可选绑定if let json = NSJSONSerialization.JSONObjectWithData 检查数据是否可以转换为 JSON 对象。条件转换 as? NSDictionary 检查 JSON 对象是否实际上是字典。您目前不使用这些检查,而是将对象转换为 NSDictionary。如果对象不是有效的 json,或者它不是字典,则会崩溃。
我会推荐这样的东西:
var error: NSError?
if let JSONData = JSONData { // Check 1
if let json: AnyObject = NSJSONSerialization.JSONObjectWithData(JSONData, options: nil, error: &error) { // Check 2
if let jsonDictionary = json as? NSDictionary { // Check 3
println("Dictionary received")
}
else {
if let jsonString = NSString(data: JSONData, encoding: NSUTF8StringEncoding) {
println("JSON String: \n\n \(jsonString)")
}
fatalError("JSON does not contain a dictionary \(json)")
}
}
else {
fatalError("Can't parse JSON \(error)")
}
}
else {
fatalError("JSONData is nil")
}
您可以将检查 2 和 3 合并为一行,并检查 NSJSONSerialization 是否可以直接创建 NSDictionary:
var error: NSError?
if let JSONData = JSONData { // Check 1.
if let JSONDictionary = NSJSONSerialization.JSONObjectWithData(JSONData, options: nil, error: &error) as? NSDictionary { // Check 2. and 3.
println("Dictionary received")
}
else {
if let jsonString = NSString(data: JSONData, encoding: NSUTF8StringEncoding) {
println("JSON: \n\n \(jsonString)")
}
fatalError("Can't parse JSON \(error)")
}
}
else {
fatalError("JSONData is nil")
}
确保在您的生产代码中使用适当的错误处理替换 fatalError