如何在Swift中获取超出范围Do-Catch(使用Try)的价值

时间:2016-01-19 08:40:32

标签: swift try-catch nsjsonserialization do-catch

我正在尝试将JSON数据解析为字典,用于解析我正在使用单独的方法,后来想将结果(字典)用于其他方法中的其他操作,而不仅仅是将其打印出来,因为它是在线提供许多例子,例如: G。 here

但是,由于我被要求在 guard 中插入 return 语句,我无法返回该值,但在插入后获取"非空函数应该返回价值"。

代码看起来如下:

 func  extractJSONDictionaryFrom(JSONData:NSData) ->NSMutableDictionary
    {
        var dict = NSMutableDictionary()
        do {
        guard let JSON = try NSJSONSerialization.JSONObjectWithData(JSONData, options:NSJSONReadingOptions(rawValue: 0)) as? NSDictionary else {
            print("Not a Dictionary")
            return
        }
            dict = NSMutableDictionary(dictionary: JSON)
        }
        catch let JSONError as NSError {
            print("\(JSONError)")
        }
        print("The JSON is \(dict)")
        return dict
    }
使用 throw

The approach几乎没用,因为我需要在调用" extractJSONDictionaryFrom"

时处理其他方法中的throws

2 个答案:

答案 0 :(得分:1)

一个选项是让你的方法抛出错误(NSJSONSerialization错误,因为JSON解析完全失败,或者如果JSON解析有效,你的自定义错误,但由于某种原因它不是字典):< / p>

func extractJSONDictionaryFrom(JSONData: NSData) throws -> NSMutableDictionary {
    guard let JSON = try NSJSONSerialization.JSONObjectWithData(JSONData, options:[]) as? NSDictionary else {
        throw NSError(domain: NSBundle.mainBundle().bundleIdentifier!, code: -1, userInfo: [NSLocalizedDescriptionKey : "Not a dictionary"])
    }
    return NSMutableDictionary(dictionary: JSON)
}

或者,另一种方法是不抛出错误,但如果转换失败则返回nil

func extractJSONDictionaryFrom(JSONData: NSData) -> NSMutableDictionary? {
    do {
        guard let JSON = try NSJSONSerialization.JSONObjectWithData(JSONData, options:NSJSONReadingOptions(rawValue: 0)) as? NSDictionary else {
            print("Not a Dictionary")
            return nil
        }
        return NSMutableDictionary(dictionary: JSON)
    } catch let JSONError as NSError {
        print("\(JSONError)")
        return nil
    }
}

我倾向于前者,但后者也是如此。

答案 1 :(得分:1)

将结果设为可选(NSMutableDictionary?)并使用return nil

如果调用方不应更改返回的字典,您可能还想返回NSDictionary?

修改

给定的代码不起作用,因为NSJSONSerialization.JSONObjectWithData在给定无效JSON的情况下抛出错误,这被catch捕获。该函数返回一个空字典而不是nil。我会尝试以下方法:

func  extractJSONDictionaryFrom(JSONData:NSData) ->NSMutableDictionary?
{
    var dict = NSMutableDictionary()
    do {
        guard let JSON = try NSJSONSerialization.JSONObjectWithData(JSONData, options:NSJSONReadingOptions(rawValue: 0)) as? NSDictionary else {
            print("Not a Dictionary")
            return nil
        }
        dict = NSMutableDictionary(dictionary: JSON)
    }
    catch let JSONError as NSError {
        print("\(JSONError)")
        return nil
    }
    print("The JSON is \(dict)")
    return dict
}

我也相信传播异常会更好。

或者,您可以为所有错误返回一个空字典而不使用可选结果,但这会“隐藏”错误,这可能是一个坏主意。