我正在学习Swift
。在第一印象中,我无法看到任何声明常量(没有初始存储值)作为类中的可选项的点...例如
let userName: String?
因为默认的初始值设定项会将其指定为nil,并且随后无法更改(因为它是常量)。
据我了解,自定义初始化程序仍然可以为其指定一个非零值,但在这种情况下,您不会将其声明为let userName: String
(即非可选)
我原本以为如果它是一个多余的模式,苹果会提到它,但我不能看到它们......所以在什么情况下可以使用可选的常量声明或有用?
答案 0 :(得分:21)
在init过程中需要为可选项指定值的常量。该值可以是零或其他值。一旦分配,它就会陷入该值。一个零就像一个"这个属性故意留空"指示牌,用永久墨水书写。
假设您有一个充满来自网络请求的响应数据的类。您获得的某些字段可能为零,或者它们可能包含数据。
您编写的代码解析来自服务器的响应并构建响应对象。响应对象的每个属性都是固定的。如果您获得该属性的信息,则它包含数据,或者为nil。
在这种情况下,使用可选常量非常有意义。
您为响应对象编写了一个init方法,该方法将接受网络回复(例如,在JSON中)并填写响应对象的属性。如果缺少JSON数据中的给定标记,则将该属性设置为nil。您使用常量,因为一旦响应对象初始化,该值就会被修复。如果它没有,它将永远是零。如果它包含一个值,它将始终包含该值,并且无法更改。
答案 1 :(得分:3)
如果您正在放置文字并将其设为可选,则可选部分无用,因为您知道number
将是1
let number: Int? = 1
但是,如果你想制作另一个对象的常量副本,你不知道来源是否为零,那就是。
var array = ["hello"]
let string: String? = array[1]
// string is nil, so you can do some checking with it
上面的示例并没有完全说明我的观点,但假设array
是一个可变数组,您可能会偶尔删除并偶尔添加值(如果您正在检查,则可能会获得零值) " 1"索引)
答案 2 :(得分:2)
如果没有提供初始值,则只有可选变量会自动设置为nil
T型可选常量?不会自动设置为零 它需要使用类型为T或nil
的值手动初始化如果在使用前没有手动初始化,则会抛出“初始化前使用的常量”错误
同样,如果一个类没有显式的可选常量属性,手动初始化它也没有构造,则会抛出错误“class has no initialisers”