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赋给自己,也可以赋给另外的变量,并判断nil
if 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)
