在Swift中检查nil的选项

时间:2014-06-07 20:48:26

标签: json swift

如何在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的观点?

4 个答案:

答案 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