一尘不染

为什么可选常量不会自动具有默认值nil

swift

以下代码可以正常工作

struct carConfi {
    var owner: String?
    let brand: String = "BMW"
    var currentMile: Double = 2000
}

let tomCar = carConfi()

但是,如果我将属性的类型更改owner为常量,则初始化器会出现错误

struct carConfi {
        let owner: String? // Change to constant
        let brand: String = "BMW"
        var currentMile: Double = 2000
    }

let tomCar = carConfi() //error: missing argument for parameter 'owner' in call

我做了一点搜索,结果是因为 可选 变量自动具有默认值nil

我猜:
因为一旦设置了常量,就无法对其进行更改,如果自动接收到可选常量,nil那么它将保持为不可更改nil,这是非常愚蠢的,并且可能会对用户不利。

问题: 我的大学并不完全相信这个猜测,他告诉我一定有更多的理由。如果有人可以向我解释,我将不胜感激

谢谢


阅读 259

收藏
2020-07-07

共1个答案

一尘不染

不使用以下任何一种设置只读(常量)字段:

  • 初始化表达式
  • 初始化器

几乎可以肯定地表明您的程序有错误。

由于您没有其他机会设置let字段的值,因此该字段的值将保持不变nil(或其他一些默认值)。程序员不太可能会发现这种行为是可取的,并有意要求它。

这就是为什么Swift将这种情况标记为错误。另一方面,如果您实际上希望String常量保持不变nil,则可以添加一个表达式以将其设置为nil,并使错误静音:

let owner: String? = nil // Pretty useless, but allowed
2020-07-07