Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化!否则会报错!
声明为Optional只需要在类型后面紧跟一个?即可.
上面这个Optional的声明,不是声明了一个Optional的String值。
-1- 而是”我声明了一个Optional类型值.
-2- 它可能包含一个String值,也可能什么都不包含!
说白了就是:这个?表示,可选类型,swift自动判断你声明的要么有值,要么为nil。
疑惑:为啥要这么设计?
答: 因为 你声明一个 var a = "123" , 很明显是字符串,可以转化 int 类型,let convertedNumber = Int(a) 。但是 当 var a = "你好", 这时要转Int就报错了。为了解决这个问题swift就设计了“?”这么个玩意出来。如果转化不了Int,不要给我报错,直接返回啥都没有,不是返回 nil (nil是一个确切的值).
Optional是一个 enum 值,里面有None和Some两种类型。看官方文档!
其实所谓的nil就是Optional.None, 非nil就是Optional.Some, 然后会通过Some(T)包装(wrap)原始值,这也是为什么在使用Optional的时候要拆包(从enum里取出来原始值)的原因.
只要 声明为Optional的,如果不显式的赋值就会有个默认值nil.
Optional值需要拆包(unwrap)后才能得到原来值,然后才能对其操作,那怎么来拆包呢?
! 在具体的操作前添加 ! 符号
就是有切确的值存在,“?”有可能有值,也不一定有值。每次对这种类型的值操作时,都会自动在操作前补上一个!进行拆包,然后在执行后面的操作.
总结:
“? ” 的几种使用场景:
0、可选值,表示有值 或者 nill
1.声明Optional值变量
2.用在对Optional值操作中,用来判断是否能响应后面的操作
3.用于安全调用protocol的optional方法
4.使用 as? 向下转型(Downcast)
“!” 大概也有两种使用场景
1.强制对Optional值进行拆包(unwrap)
2、这个一定是非nill的值。
nill 是一个确切的值。
“as”