0

我使用weatherAPI 进行某种JSON 解析。为了防止我遇到 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陈述中,这样我就可以处理那个案子。

非常感谢。

4

3 回答 3

1

您滥用了 guard 的语法 - 按如下方式使用它:

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 letDamien 概述的语法。

于 2016-10-03T09:52:55.523 回答
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

也许更好地尝试分别为每一行拆分这些保护语句,以防万一失败,您的整个块不会退出。在这种情况下,最好使用 if let ,因为您不想提前退出。只是不要用 if let 语句开始任何厄运金字塔。

/// 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
}

希望这可以帮助。

于 2016-10-03T09:54:07.980 回答
0

您应该寻找有条件的展开:https ://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html

if let weather = json["weather"] {
// weather is define here, you can use it
}
于 2016-10-03T09:49:51.470 回答