2016-02-14 63 views
0

有一個類似命名的主題,但該示例是由於用戶錯誤導致的錯誤。我相信這個例子是一個真正的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) 

    } 
} 
+0

給你的初始化程序添加一個斷點,然後重新運行你的程序......通過你的應用程序,直到初始化程序返回提前,然後你就會遇到你的問題。 –

+0

此外,失敗的警戒語句會導致提前返回,在這種情況下會導致初始化失敗。如果在這種情況下讓它成爲更好的選擇,最好有一個空標籤而不是失敗的初始化。 –

+0

@DanBeaulieu啊,早點回復我猜這就是它,謝謝。也許他們會爲未來添加更好的錯誤信息?或者如果我把它作爲一個可疑的初始化工作,它會工作嗎? –

回答

0

讓我們

struct S { 
    var i: Int? 
    init(b: Bool){ 
     guard b == false else { return } 
     //if b == true { return } 
     i = 0 // if b == true, this statement doesn't execute 
    } 
} 

let s1 = S(b: true) 
let s2 = S(b: false) 
print(s1, s2) // S(i: nil) S(i: Optional(0)) 

因爲var i: Int?有默認值爲零,即使i = 0不可達,如果初始化參數爲true,則編譯器不抱怨。

struct S { 
    let i: Int? 
    init(b: Bool){ 
     guard b == false else { return } 
     //if b == true { return } 
     i = 0 // if b == true, this statement doesn't execute 
    } 
} 

將不能編譯,與error: return from initializer without initializing all stored propertiesnote: 'self.i' not initialized,因爲不斷let i: Int?沒有任何缺省值

你麻煩的是,你從初始化返回。通常,如果您的初始化程序不是fail-able/init,請避免從初始化程序返回? /。如果無法啓動init?唯一可接受的返回值是零。