注意
任何没有被定义为可选性的变量,都不可置为nil,否则系统会报错。
可选型在声明未被赋值时,默认是nil,即使是Int类型也是nil,而不是0,非可选型在声明没有赋值时,是不可以使用的。
optional是一种类型,并不能直接做一些运算之类的操作,如果要,那就必须先解包
,把数据取出来使用。
可选项绑定
通过解包赋值成功与否来判断解包是否成功。
可选性绑定不能用&&
来筛选条件,要用逗号
。
空合并运算符
b决定了返回的类型。
先看最右边,决定了返回的类型,是3那就是解包int类型,在看前面取哪个值。
Guard
一个简单地关于登录判断的例子分析
因为传入的是字典,在拿到字典里的值得时候,这个值是可选项,要做可选项绑定,因为这个tmp值只作用在当前if判断里面,所以需要在外层拿一个变量去接收。
如果用guard的话呢??
guard的意思是,当前判断不成立,才会走大括号里面的内容,并且此时声明的值可以在整个作用域里使用,注意
的就是,大括号里面必须返回return或者break或者continue,退出当前作用域,类似switch,让他跳出语句。
隐式解包
在某些情况下,可选项的值在一开始就已经设置了,那么他就会一直拥有这个值,那么为了避免重复的检查,可以通过隐式解包的方式拿到他的值。要注意的是,不能是nil,会报错!
在声明一个可选型的时候,通过感叹号直接解包,后续用的时候可以直接赋值,这句话的意思相当于如果你没有在类型后加感叹号,那么在用的时候,let num2:Int = num1!这样才可以,因为里面是可选型,拿值得话必须解包才可以。但是在开发中尽量不要这么声明,因为可选型是可以被重新赋值的,万一又变成了nil就崩了。一般还是带问号的声明。
字符串插值
第一种就是强解包,第二种就是通过swift的方法描述将可选项变成字符串描述值,第三种就是用空合并运算符。
多重可选项
第一种就是正常的一个盒子装了一个int类型的值,这个num1就是Int?类型,第二个类型是Int??,这也是个盒子,只不过里面装的是Int?类型,所以可以直接复制num1,第三种,跟第一种情况一样,就是直接声明一个Int??类型,只不过盒子里装的是10,2和3的效果是一样的。
可以通过lldb指令去看对应变量,具体fr v -R + 变量
,如果num1是nil,打印出如果第一个就是none,那么后面的基本可以不用看了。