Swift 2.0 Guard语句失败结构初始化程序

时间:2016-02-14 00:13:29

标签: swift swift2 guard-statement

有一个类似命名的主题,但该示例是由于用户错误导致的错误。我相信这个例子是一个真正的XCode问题。

我正在遵循一个树屋教程,并且在swift 2.0的精神中,我使用了guard语句,而不是在初始化程序中使用了let。除了使用guard语句之外,我的代码与指令相同。它有一个错误表示"从初始化程序返回而没有初始化所有存储的属性"。一旦我将其更改为let语句,它就可以了。也许我在某个地方犯了一个错误,但我盯着它看了至少一个小时,没有任何属性没有被初始化。

我在else子句中使属性等于nil以防万一,但这并没有影响任何东西。

struct 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)

  }
}

1 个答案:

答案 0 :(得分: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?的默认值为nil,即使init的参数为true也无法访问i = 0,编译器也不会抱怨。

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?没有任何默认值

你的麻烦是,你从init返回。通常,如果初始化程序不是故障/ init,请避免从初始化程序返回? /。在初始化失败的情况下?唯一接受的返回值是nil。