1、打开Xcode编辑器,创建一个MacOS的命令行项目,在其中定义一个字典类型,用于演示可选类型的转换// 定义字典类型var dict = [0: "Red", 1: "Green", 2: "Blue"]

2、定义一个非空类型,使用感叹号将字典中的值强制转换为非空类型// 将字典中的第一项取出来,转换为非空的值var color = dict[0]!// 输出结果,正确的输出了 Red 值print(color)

3、假设,要获取字典中序号为4的,当前不存在字典中的键,会怎么样呢?// 获取不存在字典中的键值,并将其转换为非空的值var color2 = dict[4]!// 输出结果,跟C#/java一样会直接报错print(color2)

4、此时,就很自然的想到,在转换的时候,先判断结果是否为nil,不为nil再转换,这个时候就可以使用if-髫潋啜缅else来判断了// 获取不存在字典中的键值,并将其转换为非空的值var color2 = dict[4]if color2 != nil { // 如果结果不是nil,就直接转换 print(color2!)} else { // 输出结果nil print(color2)}

5、这种方式的if-else写起来还是比较麻烦,那么,Swift语法中如何精简这种写法呢?// 此处使用 var 或者 let都可以,只不过let的变量,后面不能重新赋值if var color = dict[4] { // 如果dict[4]不为nil,才执行的语句 print(color)}print("done")

6、上面这种方式,定义的变量在if外面用不了,如果在if外面再定义一个相同的变量,会是什么样的结果呢?// 此处使用 var 或者 let都可以,只不过let的变量,后面不能重新赋值var color = dict[0]// 此处是不是很神奇,可以将color赋给自己,也可以赋给另外的变量,并判断nilif var color = color { // 如果dict[4]不为nil,才执行的语句 print(color) color = "修改后的值"}// 这里的color是if外面的color变量,跟if同一行的color变量是两个变量print(color)

7、上面的方式,还是会觉得代码太多,有没有更加简单的方式呢?答案是有的,那就是使用双问号// 定义变量,赋值不存在的字典键值var color = dict[4];// 使用双问号,如果color结果是nil,就返回双问号后面的值var color2 = color ?? "color为空"// 输出结果:color为空print(color2)
