2016-10-03 45 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

相關問題