为啥可选常量不会自动具有默认值 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
也不允许这种行为。
let
s 默认为 nil 将允许子类继承其超类的初始化程序。使用var
可以做到这一点。但是将let
添加到子类中,然后您需要覆盖超类的初始化程序。
我完全理解你的回答,我只是理解你的术语。 初始化表达式是什么意思,你的意思是String? = nil
? initializer 你的意思是init (owner: String) self.ownder = ownder
?
@Honey 正确,初始化表达式是=
中let owner: String? = nil
中的内容。在这种情况下,初始化表达式是nil
,initializaer 是init
的任何重载。【参考方案2】:
常量设置一次,并且只设置一次。如果您希望它为 null 或 0,那么您可以设置它。您总是在启动时定义一个常数。
【讨论】:
以上是关于为啥可选常量不会自动具有默认值 nil [重复]的主要内容,如果未能解决你的问题,请参考以下文章