常量未分配的可选项默认不会为nil。

12

我的理解:如果您定义一个可选变量而不分配任何值,则编译器将自动分配nil

代码片段:

A:

var someOptional : Int? //Change to `let` to trigger error 
var aDefaultValue = 42
var theAnswer = someOptional ?? aDefaultValue

上面的代码片段运行良好,但当我将变量 someOptional 更改为常量时,编译器会报错(请参见下面附加的图像)。

enter image description here

B: 然后我尝试了相似的代码以解决这个问题。

var someOptional : Int?
print(someOptional)

但是,它在变量类型下运行良好,但在常量类型下失败。

enter image description here

结论:

如果您定义一个常量可选项,而且如果您的意思是赋值为nil,那么您必须显式地进行赋值。因为如果编译器自动为您执行该操作,它看起来没有用处(为什么您需要将常量选项分配给nil),这可能会引入错误。

问题:

为什么编译器假设var声明的可选项为nil,但不适用于let声明的可选项?


2
鉴于这个问题和另一个问题都是同一用户提出的,而较新的问题似乎更清晰,并且有一个更好的答案,我将较早的问题标记为较新的问题的重复,而不是相反,正如您的关闭投票建议@Hamish所推荐的那样。 - nhgrif
@Hamish ...... 哎呀,这已经是我第二次犯这种错误了。我是编程新手,要记住的东西太多了,这已经是我第三遍从苹果文档中学习代码了。对于重复造成的麻烦,我深表歉意。也许下次我需要先搜索我的问题。 - SLN
2
如果你只是查看自己的个人资料,你就可以找到你提出的问题列表。但实际上,即使这样做也是不必要的。只需尝试搜索你想到的问题的答案。这就是专业人士所做的。一点点研究可能会防止这两个问题在第一时间被提出。 - nhgrif
@nhgrif 感谢您的建议和提示,我确实有些懒惰,这是一种不好的态度。下次我会先搜索而不是急于提问。 - SLN
1个回答

10

是的,这是正确的

可选变量不需要手动初始化。如果在填充之前读取它,则包含nil

来自苹果文档

如果定义一个可选变量而没有提供默认值,则变量会自动设置为nil[...]

另一方面,编译器确实强制你在读取之前手动初始化可选常量(let)。

与变量不同,常量的值一旦设置就无法更改。当编译代码时尝试更改常量的值会报告为错误[...]

为什么?

常量只能写入一次。它不需要在初始化的同一行发生,但必须在读取它之前发生。

例如,此代码可以正常工作

let num: Int?
num = 1
print(num)

然而,如果编译器在num中放置了一个临时的nil值,那么常量就会被写入两次。这是违反常量概念的。
let num: Int?
print(num) // nil ??? <- this can't work! 
num = 1
print(num) // 1

另一个例子

这段代码片段运行良好

func printArea(width: Int?, height:Int?) {
    let area: Int?
    if let width = width, height = height {
        area = width * height
    } else {
        area = nil
    }
    print(area)
}

如果编译器在area中放置了一个临时的nil值,那么...

func printArea(width: Int?, height:Int?) {
    let area: Int?
    print(area) // not possible! area is going to change in a moment
     if let width = width, height = height {
        area = width * height
    } else {
        area = nil
    }
    print(area)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接