我正在尝试将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答案 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
}
我也相信传播异常会更好。
或者,您可以为所有错误返回一个空字典而不使用可选结果,但这会“隐藏”错误,这可能是一个坏主意。