常量未分配的可选项默认情况下不会为 nil

Posted

技术标签:

【中文标题】常量未分配的可选项默认情况下不会为 nil【英文标题】:Constant unassigned optional will not be nil by default 【发布时间】:2016-08-14 12:36:17 【问题描述】:

我目前的理解:如果你定义一个可选变量而不赋值,编译器会自动赋值nil

代码片段:

A:

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

上面的代码sn-p可以正常工作,但是当我将变量someOptional改为常量时,编译器报错(见下图)

乙:

然后我尝试了类似的代码来解决问题。

var someOptional : Int?
print(someOptional)

不过,它对变量工作正常,而对常量类型失败。

结论:

如果你定义了一个可选的常量,你必须明确地指定 nil。因为它看起来没用(为什么你需要一个用nil 分配的常量选项),如果编译器自动为你这样做,它可能会引入错误。

问题:

为什么编译器假定 nil 代表 var 声明的可选值而不是 let 声明的选项?

【问题讨论】:

Why optional constant does not automatically have a default value of nil的可能重复 鉴于这个问题和this other question 都是由同一个用户提出的,而且新的问题似乎更清晰,答案也更好,我已将旧问题标记为重复较新的,而不是反之亦然,因为您的近距离投票建议@Hamish @Hamish ...... OMG 这是我第二次这样做了。我是编程新手。东西太多记不住了,这实际上是我第三轮研究苹果文档中的代码。我为重复道歉,我忘记了我从前两轮中学到的一些主题。也许下次我需要先搜索我的问题。 如果您只是look at your own profile,您可以找到您提出的问题列表。但实际上,即使这样做也是不必要的。只需尝试搜索您想到的问题的答案。这是专业人士所做的。一些研究可能会阻止这两个问题一开始就被问到。 @nhgrif 感谢您的友好建议和提示,我很懒惰,这是一种不好的态度。下次我会搜索而不是快速弹出问题。 【参考方案1】:

是的,没错

可选变量不需要手动初始化。如果您在填充之前阅读它确实包含nil

来自苹果docs

如果您定义一个可选变量而不提供默认值,则该变量会自动为您设置为 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

另一个例子

这段代码 sn-p 工作正常

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)

【讨论】:

以上是关于常量未分配的可选项默认情况下不会为 nil的主要内容,如果未能解决你的问题,请参考以下文章

为啥可选常量不会自动具有默认值 nil [重复]

swift 可选项(Optional)

Swift 中的选项 - 不为选项分配默认值 [重复]

swift中的可选类型

为什么Ruby的默认参数值不能分配给nil参数?

Swift之Optional 可选值