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 

我查了一下,结果发现是因为可选变量自动有一个默认值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/43565606/

相关文章:

ios - ios 中的 UICollectionView 单元格滚动问题

ios - 如何每 10 秒使用 CLLocationManager 获取位置?

C++ 等价于 Rust 的 Result<T, E> 类型?

string - 在字符串中省略 nil

objective-c - UIAlertController 延迟显示

ios - 查看 iOS 应用程序是否使用 Swift 编译

ios - 从 Firebase 下载表格 View 中的项目过多

c++ - 为什么 GCC 拒绝引用 std::optional?

swift - 通用可选枚举函数

ios - 在 Swift 属性包装器中支持可选参数值