如何在Swift中检查Option值是否为nil值?
我试图评估解析JSON是否成功。这应该在传递无效的json时打印错误消息,但在EXC_BAD_INSTRUCTION时失败。
func parseJson(data: NSData) {
var error: NSError?
var json: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary
if let err = error {
println("error parsing json")
return
}
println("json parsed successfully")
}
尝试使用有效的json运行(工作正常):
parseJson(NSData(data: "{}".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)))
尝试使用无效的json:
parseJson(NSData(data: "123".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)))
我是否错过了使用Optionals的观点?
答案 0 :(得分:6)
崩溃正在发生,因为如果出现错误,JSONObjectWithData返回nil。然后尝试将nil转换为NSDictionary。这有效:
func parseJson(data: NSData) {
var error: NSError?
var json : AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error)
if let err = error {
println("error parsing json")
return
}
println("json parsed successfully")
var jsonDict = json as NSDictionary
}
如果您愿意,可以将var json的类型切换为NSDictionary吗?所以它直接处理零。要做到这一点,你只需要添加'?'到“as”关键字如下:
func parseJson(data: NSData) {
var error: NSError?
var json: NSDictionary? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as? NSDictionary
if let err = error {
println("error parsing json")
return
}
// unwrap the optional value
if let jsonDictionary = json {
println("json parsed successfully")
// use the dictionary
}
}
答案 1 :(得分:1)
我稍微重构了你的代码:
func parseJson(data: NSData) {
var error: NSError?
var json: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error)
if let jsonDict: NSDictionary = json as? NSDictionary{
println("json parsed successfully")
//do something with the nsdictionary...
}
else{
println("error parsing json")
}
}
parseJson(NSData(data: "{}".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)))
parseJson(NSData(data: "123".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)))
问题不在于你的if代码,而是在方法失败的情况下使json成为NSDictionary。此外,此代码现在检查是否返回了NSDictionary,而不是检查错误本身。
答案 2 :(得分:0)
NSJSONSerialization.JSONObjectWithData
返回一个隐式展开的可选值,这意味着返回值可能为nil。在无效的JSON情况下,返回了nil可选类型。因此,您的var json
也必须是可选类型,因为它可能是零。此外,如果var json
是可选类型,则必须通过在?
旁边添加as
将其向下转换为可选项。这是最终结果
var json: NSDictionary? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as? NSDictionary
答案 3 :(得分:0)
我得到fatal error: unexpectedly found nil while unwrapping an Optional value
,直到我将NSDictionary类型转换为可选,例如as? NSDictionary
代替as Dictionary