有时我们使用一个变量或常量,它储存的值可能有也可能没有此时我们就需要将这个常量或变量设置为可选类型。使用可选类型是为了处理值可能缺失的情况。可选类型是Swift全新的数据类型,它的特点是可以值,也可以没有值,没有值额时候,就是nil。只需要在数据类型后面加上问号(?)就可以定义一个Optional(可选)类型的数据。示例代码如下:
1 | var str: String?
2 | print(str)
运行结果:nil
这里我们只声明了str为一个可选类型的字符串,没有为它赋值。所以打印出来是nil。
1.可选绑定
可选类型可以用于判断,就是我们在程序中经常会使用到的可选绑定。可以使用 if 语句来判断一个可选的是否包含一个值。如果包含一个值,结果为 true ,否则 false。
1 | var myString:String? = nil
2 | if myString != nil {
3 | print(myString)
4 | }else{
5 | print("myString has nil value")
6 | }
运行结果:myString has nil value
在上述代码中,第1行代码定义了String类型的可选值myString。并初始化为nil。通过if语句对可选类型进行判断。如果myString不为空,则输出myString。否则输出myString has nil value。
这种可选类型在if或while语句中赋值并进行判断的写法,叫做可选绑定。
2.强制拆包
如果我们能确定可选类型一定有值,那么在读取它的时候,可以在可选类型的后面加一个感叹号(!)来获取该值。这种感叹号的表示方式称为可选值的强制拆包。如下代码所示:
1 | var myString:String?
2 | myString = "Hello, Swift!"
3 | if myString != nil {
4 | print(myString)
5 | }else{
6 | print("myString has nil value")
7 | }
运行结果:
Optional("Hello, Swift!")
现在我们来使用拆包获取正确的值
1 | var myString:String?
2 | myString = "Hello, Swift!"
3 | if myString != nil {
4 | print( myString! )
5 | }else{
6 | print("myString has nil value")
7 | }
此时的运行结果为:Hello, Swift!
通过上面例子,我们看到在myString后面加上(!),完成对可选类型的拆包。
3.隐式拆包
为了能够方便地访问可选类型,我们可以将可选类型后面的问(?)换成感叹号(!),这种可选类型在拆包时在变量或常量后面不加感叹号(!)的表示方式称为隐式拆包。如下代码所示:
1 | var myString:String!
2 | myString = "Hello, Swift!"
3 | if myString != nil {
4 | print( myString)
5 | }else{
6 | print("myString has nil value")
7 | }
在上述代码中在第1行定义的字符串变量myString的数据类型String后面使用感叹号(!)而不是问号(?),在拆包的时候,变量或常量后面不用加感叹号(!),这就是隐式拆包。隐式拆封的变量或常量使用起来就像普通变量或常量一样,你也可以把它看成是普通的变量或常量。