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

Posted

技术标签:

【中文标题】为啥可选常量不会自动具有默认值 nil [重复]【英文标题】:Why optional constant does not automatically have a default value of nil [duplicate]为什么可选常量不会自动具有默认值 nil [重复] 【发布时间】:2016-05-23 20:43:30 【问题描述】:

以下代码可以正常工作

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 会有什么可能的用例?但这很可能是一个错误,因此出现错误肯定会有所帮助。 您可以将此示例归结为 let foo:String?; print(foo)var foo:String?; print(foo) 顺便说一句。 【参考方案1】:

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

初始化表达式 初始化器

几乎可以肯定是您的程序出现错误的迹象。

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

这就是 Swift 将这种情况标记为错误的原因。另一方面,如果你真的希望你的String 常量保持nil,你可以添加一个表达式来将它设置为nil,然后消除错误:

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

【讨论】:

certain 初始化器设置值,而其他人忽略该属性(并将其设置为默认值 nil)似乎不是不合理的。提到的let owner: String? = nil 也不允许这种行为。 lets 默认为 nil 将允许子类继承其超类的初始化程序。使用var 可以做到这一点。但是将let 添加到子类中,然后您需要覆盖超类的初始化程序。 我完全理解你的回答,我只是理解你的术语。 初始化表达式是什么意思,你的意思是String? = nilinitializer 你的意思是init (owner: String) self.ownder = ownder ? @Honey 正确,初始化表达式是=let owner: String? = nil 中的内容。在这种情况下,初始化表达式是nil,initializaer 是init 的任何重载。【参考方案2】:

常量设置一次,并且只设置一次。如果您希望它为 null 或 0,那么您可以设置它。您总是在启动时定义一个常数。

【讨论】:

以上是关于为啥可选常量不会自动具有默认值 nil [重复]的主要内容,如果未能解决你的问题,请参考以下文章

具有标量类型的 Swift Core Data 可选属性被评估为 0 而不是 NIL [重复]

Swift之Optional 可选值

关于swift中的可选类型

默认值不会设置为 Nil? - 斯威夫特

swift中的可选类型

为啥使用可选绑定?