有一個類似命名的主題,但該示例是由於用戶錯誤導致的錯誤。我相信這個例子是一個真正的XCode問題。Swift 2.0 Guard語句失敗結構初始化程序
我正在關注一個樹屋教程,並且本着swift 2.0的精神,我使用了guard語句,而不是在初始化程序中如何讓。除了使用guard語句外,我的代碼與指令相同。它有一個錯誤,表示「從初始化程序返回而沒有初始化所有存儲的屬性」。一旦我改變它,如果讓發言,它的工作。也許我在某個地方犯了一個錯誤,但我盯着它至少一個小時,沒有任何財產沒有被初始化。
我在else子句中使屬性等於nil,以防萬一,但這並沒有影響任何東西。
結構DailyWeather {
let maxTemp: Int?
let minTemp: Int?
let humidity: Int?
let precipChance: Int?
var summary: String?
var icon: UIImage? = UIImage(named: "default.png")
var largeIcon: UIImage? = UIImage(named: "default_large.png")
var sunriseTime: String?
var sunsetTime: String?
var day: String?
let dateFormatter = NSDateFormatter()
init(dailyWeatherDictionary: [String:AnyObject]) {
minTemp = dailyWeatherDictionary["temperatureMin"] as? Int
maxTemp = dailyWeatherDictionary["temperatureMax"] as? Int
guard let humidityFloat = dailyWeatherDictionary["humidity"] as? Double else { humidity = nil ; return }
humidity = Int(humidityFloat * 100)
guard let precipFloat = dailyWeatherDictionary["precipProbability"] as? Double else { precipChance = nil ; return }
precipChance = Int(precipFloat * 100)
summary = dailyWeatherDictionary["summary"] as? String
guard let
iconString = dailyWeatherDictionary["icon"] as? String,
iconEnum = Icon(rawValue: iconString) else { icon = nil ; largeIcon = nil ; return }
(icon, largeIcon) = iconEnum.toImage()
guard let sunriseDate = dailyWeatherDictionary["sunriseTime"] as? Double else { sunriseTime = nil ; return }
sunriseTime = timeStringFromUnixTime(sunriseDate)
guard let sunsetDate = dailyWeatherDictionary["sunsetTime"] as? Double else { sunsetTime = nil ; return }
sunsetTime = timeStringFromUnixTime(sunsetDate)
guard let time = dailyWeatherDictionary["time"] as? Double else { day = nil ; return }
day = dayStringFromUnixTime(time)
}
func timeStringFromUnixTime(unixTime: Double) -> String {
let date = NSDate(timeIntervalSince1970: unixTime)
dateFormatter.dateFormat = "hh:mm a"
return dateFormatter.stringFromDate(date)
}
func dayStringFromUnixTime(unixTime: Double) -> String {
let date = NSDate(timeIntervalSince1970: unixTime)
dateFormatter.locale = NSLocale(localeIdentifier: NSLocale.currentLocale().localeIdentifier)
dateFormatter.dateFormat = "EEEE"
return dateFormatter.stringFromDate(date)
}
}
給你的初始化程序添加一個斷點,然後重新運行你的程序......通過你的應用程序,直到初始化程序返回提前,然後你就會遇到你的問題。 –
此外,失敗的警戒語句會導致提前返回,在這種情況下會導致初始化失敗。如果在這種情況下讓它成爲更好的選擇,最好有一個空標籤而不是失敗的初始化。 –
@DanBeaulieu啊,早點回復我猜這就是它,謝謝。也許他們會爲未來添加更好的錯誤信息?或者如果我把它作爲一個可疑的初始化工作,它會工作嗎? –