2016-10-03 43 views
0

我做了某种JSON解析weatherAPI。为了防止我陷入nullPointer(也许这个页面离线或者什么的),我把我的解析包括进了一个警卫,因为我认为他保护我解开可选值。为什么警卫不能保护我免受我

guard 
    let loadedWeather = (json["weather"] as! [[String:AnyObject]])[0]["description"] as? String, 
    let loadedTemperatur = (json["main"] as! [String:AnyObject])["temp"] as? Float, 
    let loadedWindSpeed = (json["wind"] as! [String:AnyObject])["speed"] as? Float 
else { 
    print("Weather JSON-Parsing failed") 
    return 
} 

我误解了警卫的功能吗?如果是这样,我该如何解决这个问题? 实际上该页面处于脱机状态,并返回一个带有其他标签的错误JSON页面,所以“天气”,“主要”等等。不包括。我希望在这种情况下,我的警卫将我带入我的else声明中,以便我可以处理这种情况。

非常感谢。

回答

1

你滥用了后卫的语法 - 使用它,如下所示:

guard let weatherArray = json["weather"] as? [[String:AnyObject]], let mainDict = json["main"] as? [String:AnyObject], let windDict = json["wind"] as? [String:AnyObject] else { 
    return 
} 
guard let dict = weatherArray.first else { 
    return 
} 
guard let description = dict["description"] as? String, let temp = mainDict["temp"] as? Float, let speed = windDict["speed"] as? Float else { 
    return 
} 

虽然我会建议您按照if let语法概述由达米恩。

0

变化

as! [[String:AnyObject]] 

as? [[String:AnyObject]] 

您正在试图迫使投你的JSON数据(!),所以即使你使用的守护你还是会在该点,如果得到一个崩溃其零。

编辑:你说它仍然强迫!所以也许尝试像这样分解你的代码。还应该让它更易读,更容易从json响应的字典/数组中获取其他信息。像这样的东西应该工作

/// Get json data 
guard 
    let loadedWeather = json["weather"] as? [[String:AnyObject]], 
    let loadedTemperatur = json["main"] as? [String:AnyObject], 
    let loadedWindSpeed = json["wind"] as? [String:AnyObject] 
    else { 
    print("Weather JSON-Parsing failed") 
    return 
} 

/// Get info from json data 
guard 
    let weatherDescription = loadedWeather[0]["description"] as? String, 
    let temperature = loadedTemperatur["temp"] as? Float, 
    let windSpeed = loadedWindSpeed["speed"] as? Float 
    else { 
    print("Weather JSON-Parsing failed") 
    return 
} 

/// do something with weather description, temperature, windSpeed 

甚至更​​好的尝试单独分割每行的后卫语句,使柜面一个失败,你的整个块不会退出。在那种情况下,如果因为不想早点退出而更好使用。如果发表声明,就不要启动厄运的任何金字塔。

/// Weather 
if let loadedWeather = json["weather"] as? [[String:AnyObject]], 
    let weatherDescription = loadedWeather[0]["description"] as? String { 
     // do something with weather description 
} 

/// Temperature 
if let loadedTemperatur = json["main"] as? [String:AnyObject], 
    let temperature = loadedTemperatur["temp"] as? Float { 
    // do something with temperature 
} 

/// Wind speed 
if let loadedWindSpeed = json["wind"] as? [String:AnyObject], 
    let windSpeed = loadedWindSpeed["speed"] as? Float { 
    // do something with windspeed 
} 

希望这会有所帮助。

+0

Swift编译器迫使我做! – kuemme01

+0

构建失败与as? – kuemme01

+0

你应该尝试分解你的代码,而不是做这个大规模的声明。让我更新我的答案,给我几分钟。 – crashoverride777

相关问题