Swift - 使用let关键字的可选项

21

我正在学习 Swift。在第一印象中,我看不出在类中将常量(没有初始存储值)声明为可选的任何意义。

例如:

let userName: String?
因为默认初始化程序会将其分配为nil,并且随后不能更改(因为它是一个常量)。
据我所知,自定义初始化程序仍然可以将非 nil 值分配给它,但在这种情况下,您只需要将其声明为 let userName:String (即非可选项)
我原本期望如果它是一个多余的模式,那么苹果公司会提到它,但我看不到他们提到过。那么在哪些情况下会使用或有用 Optional 常量声明?

假设您有一个应用程序,用户通过电子邮件注册,并且他们可以选择输入用户名。您想将这两个信息传递给下一个控制器。下一个控制器知道这些值在其生命周期内永远不会更改,但是用户名是可选的。因此,您将其声明为“String?”。 - Connor Neville
3个回答

35
一个可选的常量在初始化过程中需要被赋值。这个值可以是nil,也可以是其他值。一旦赋值,它就会一直保持在那个值上。nil就像是用永久墨水写下的“此属性故意留空”指示符。
假设你有一个接收网络请求响应数据的类。你从服务器得到的一些字段可能是nil,或者它们可能包含数据。
你编写代码来解析服务器的响应并构建响应对象。响应对象的每个属性都是固定的。如果该属性有信息,则它包含数据,否则为nil。
在这种情况下,使用可选常量是非常合理的。
你需要为响应对象编写一个init方法,该方法将采取网络回复(例如JSON)并填充响应对象的属性。如果JSON数据中缺少某个标记,则将该属性设置为nil。 使用常量是因为一旦响应对象被初始化就无法更改其值。如果它是nil,它将永远是nil。 如果它包含一个值,它将永远包含该值,而且不能被改变。

1
超级棒的 @Duncan C,喜欢你的解释方式!! - Abhimanyu Rathore

6

如果没有提供初始值,只有可选变量才会自动设置为nil。


类型为T?的可选常量不会自动设置为nil,需要手动使用类型T或nil进行初始化。

  • 如果在使用之前未手动初始化,则会抛出“未初始化使用常量”的错误。

  • 同样地,如果一个类具有可选的常量属性,而没有显式地手动初始化它,并且也没有构造函数,则会抛出“类没有初始化器”的错误。


3
如果你在使用字面量时将其设置为可选的,那么可选部分是没有意义的,因为你知道number将会是1
let number: Int? = 1

然而,如果你想要制作另一个对象的不变副本,而你不确定源对象是否为nil,则应该这样做。
var array = ["hello"]
let string: String? = array[1]

// string is nil, so you can do some checking with it

上面的例子并没有很好地阐述我的观点,但是假设array是一个可变数组,您可能会不定期地删除和添加值(如果您正在检查“1”索引,则可能会得到nil值)。

6
更好的示例是let string: String? = array.first。如果数组中不包含两个对象,表达式array[1]会崩溃,而array.first返回一个可选项,如果数组为空则包含nil。 - Duncan C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接