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

标签 swift option-type

<分区>

下面的代码可以正常工作

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 

查了一下,原来是因为optional变量自动默认为nil

我猜: 因为一旦常量被设置,它就不能被改变,如果可选常量自动接收到一个nil那么它将保持为一个不可改变的nil 这很愚蠢,可能违背用户意愿

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

谢谢

最佳答案

不设置只读(常量)字段:

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

几乎可以肯定表明您的程序存在错误。

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

这就是 Swift 将这种情况标记为错误的原因。另一方面,如果您确实希望您的 String 常量保持为 nil,您可以添加一个表达式将其设置为 nil,然后静默错误:

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

关于swift - 为什么可选常量不会自动具有默认值 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37400196/

相关文章:

macos - 使用 swift 读取 CFDictionary 中的值

ios - Swift 选项 : What if i need to change an non - optional type to optional

swift - 快速编写委托(delegate)引用的不同选项

swift - 代码重构 - Swift

条件内的快速分配

ios - 如何用手指移动 Sprite ?

f# - 为什么 'printf "%A"None' 输出 null

ios - 在 Swift 应用程序中安装 Realm

swift - 评估 Swift 的 Bool?一行中的 true/false/nil?

java - Mockito.when().thenReturn() 不起作用或返回 null