当前位置: 首页 > 知识库问答 >
问题:

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

万俟沛
2023-03-14

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

我正在学习一个树屋教程,本着swift2.0的精神,我在初始化程序中使用了guard语句而不是if-lets。我的代码与指令相同,只是使用了警戒语句。它有一个错误,表示“未初始化所有存储属性就从初始化程序返回”。一旦我把它改为if-let语句,它就起作用了。也许我在什么地方犯了错误,但我盯着它看了至少一个小时,没有任何属性未初始化。

为了以防万一,我在other子句中使属性等于nil,但这并没有影响任何事情。

struct每日天气{

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个答案

云建木
2023-03-14

让我们拥有

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

因为< code>var i: Int?的默认值为nil,即使如果init的参数为true,则< code>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
    }
}

不会编译,有错误:从初始值设定项返回而不初始化所有存储的属性,并注意:'self.i'未初始化,因为常量让 i: Int?

你的问题是,你从init返回。通常,如果你的初始化程序不能失败/init,请避免从初始化程序返回? /.如果初始化程序不能失败?唯一接受的返回值是nil。

 类似资料:
  • 当我初始化的元素应用程序崩溃,如果我不初始化任何元素的应用程序显示的布局只是罚款和做一些基本的功能,我已经添加了使用在XML的onClick属性的方法 我需要从EditText元素中提取数据来进行计算。 java代码: 坠机记录: 致命例外:主进程:com.ajaydubey.fifamobilebulktradeprofitcounter,PID:17627java.lang.运行时异常:无法启

  • 问题内容: 我不知道如何初始化嵌套结构。在此处找到示例:http: //play.golang.org/p/NL6VXdHrjh 问题答案: 好吧,有什么特定的原因不使Proxy成为自己的结构? 无论如何,您有2个选择: 正确的方法是,只需将proxy移至其自己的结构,例如: 不太正确和丑陋的方法,但仍然有效:

  • 本文向大家介绍C ++ 17中带有初始化程序的其他语句和Switch语句,包括了C ++ 17中带有初始化程序的其他语句和Switch语句的使用技巧和注意事项,需要的朋友参考一下 在许多情况下,我们需要验证函数返回的值,然后根据该值执行条件操作。所以我们的代码如下- 只需在所有条件if-else块中遵循通用格式即可。首先,存在一个可选的初始语句来设置变量,然后是if-else块。所以一般的if-e

  • 所有Blade程序都需要创建一个 Blade 对象实例。Web服务器使用了内置的Netty Web服务,把接收客户端的请求都转交给它处理,创建一个 Blade 对象实例只需要写如下一行代码: Blade blade = Blade.me(); 工程结构 在前面的章节中我们学习了如何创建一个 Blade 工程,通常我们创建好的工程结构大致如下: ☁ project . ├── package.xm

  • 作为下一章goroutine调度的一个前序,本章先讲一些基础内容,看一看Go语言编写的程序的初始化过程。其实初始化过程中会做很多很多的事情,这里忽略大部分细节,只看一下脉络。从程序入口开始分析也是学习源代码的一个好方式。 首先,写一个hello world文件,内容如下: package main import "fmt" func main() { fmt.Println("h

  • 主要内容:初始化内嵌匿名结构体结构体内嵌初始化时,将结构体内嵌的类型作为字段名像普通结构体一样进行初始化,详细实现过程请参考下面的代码。 车辆结构的组装和初始化: 代码说明如下: 第 6 行定义车轮结构。 第 11 行定义引擎结构。 第 17 行定义车结构,由车轮和引擎结构体嵌入。 第 27 行,将 Car 的 Wheel 字段使用 Wheel 结构体进行初始化。 第 32 行,将 Car 的 Engine 字段使用 Engi