关于可选值optional
不同于OC,swift引入了一个新的概念——可选值,了解这个optional,对于swift的学习至关重要
概念定义:可以有值也可以没有值(nil)的一个类型。换句话说,它有两个状态:有值,没有值(nil)
按我的理解,可选值是带有布尔类型加持的普通类型
如何定义一个可选值呢?
上面的代码简单定义了一个叫做optionalValue的可选值。
和普通的变量定义没有太大区别,唯一不同在于,这里多了一个问号,?是对普通值的封包 要加在类型后面,也就是说,在变量或者常量的所属类型后面加一个问号就可以将其定义为一个optional
这里我给它赋值80,如果不赋值,那么它默认将是nil
可选值的强制解包forced unwrapping
通过在类型后面加一个问号,可以将这个变量或常量变为可选值,那么反过来要怎么做呢?
swift提供了解包操作,只需在可选值后面加一个叹号,就可以将可选值强制解包
据说,带有强制性质的事,都不是什么好事,于是问题来了……
上面的代码中,我创建了一个optional变量,没有赋值,那默认就是nil
在第二行当我试图将这个optional解包时,出现了错误。
原来,nil的可选值解包时候会出现错误,苹果的官方文档也强调,如果你不100%确信这个可选值有值,那么不要用强制解包
可选值绑定Optional Binding
既然强制解包在可选值为nil的时候会报错,那怎么将可选值里的数据读取出来呢?
swift提供了一个更加安全的方法——可选值绑定Optional Binding
上面是官方文档提供的用法,不太明确,下面是代码演示:
上面的代码中,我先定义了一个可选值字符串,赋值为90,然后用optional binding创建一个叫做tempValue的常量,if语句会根据tempValue是否从optionalValue中获取了值来决定是否要来打印出这个值,playground的结果显示这个tempValue被赋予了“90”
而当我不给可选值赋值,让它默认为nil的时候,打印tempValue也没有报错,if判断tempValue没有从optionValue中获取值,就什么也没有做,当然也不会报错。
这就相当于给可选值找了一个中间人,间接判断并读取可选值中的内容,在不确定当前可选值时否为nil的情况下,苹果官方推荐用这个方式判断可选值是否为nil并尝试获取可选值的数据。