Swift 为什么可选常量不自动具有默认值nil
下面的代码工作正常Swift 为什么可选常量不自动具有默认值nil,swift,optional,Swift,Optional,下面的代码工作正常 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
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
,这非常愚蠢,可能会违反用户的意愿
问题:我的大学并不完全相信这个猜测,他告诉我肯定有更多的原因。如果有人能向我解释一下,我将不胜感激
Thx常数设置一次,并且仅设置一次。如果希望它为null或0,则可以设置它。您总是在启动时定义一个常量 不使用以下选项之一设置只读(常量)字段:
- 初始化表达式
- 初始值设定项
let
字段的值,因此该字段的值将保持为nil
(或其他一些默认值)。程序员不太可能发现这样的行为是可取的,并故意要求这样做
这就是为什么斯威夫特将这种情况标记为错误。另一方面,如果您确实希望字符串
常量保持为nil
,则可以添加表达式将其设置为nil
,并消除错误:
let owner: String? = nil // Pretty useless, but allowed
你的猜测是对的。将
let
值默认为nil
有什么可能的用例?但这很可能是一个错误,因此在那里出现错误肯定是有帮助的?;打印(foo)vsvar foo:String?;print(foo)
btw。某些初始值设定者设置该值,而其他人忽略该属性(并将其设置为默认值nil
)似乎并不合理。提到的让所有者:String?=nil
也不允许这种行为。let
s默认为nil将允许子类继承其超类的初始值设定项。使用var
可以实现这一点。但是在子类中添加一个let
,然后需要覆盖超类的初始值设定项。我完全理解你的答案,我只是理解你的术语。初始化表达式是什么意思?您指的是String?=无
?而初始值设定项的意思是init(owner:String){self.ownder=ownder}
?@正确,初始化表达式是let owner:String?=无
。在这种情况下,初始化表达式是nil
,初始化器是init
的任何重载。