2016-02-14 45 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?唯一可接受的返回值是零。