Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 为什么可选常量不自动具有默认值nil_Swift_Optional - Fatal编程技术网

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)vs
var 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
的任何重载。