?和!
swift中有一种类型Optional,这个类型里有两个值optional.None和optional.Some。
?是声明的变量没有被初始化就为nil,被初始化了就根据初始化的数据类型,转化为相应的数据类型。但是变量的真实类型依旧是optional类型,如图,为变量s初始化赋值"lpl",s变量就隐式判断为String类型,但是其真正的类型还是optional
swift中只有optional类型的变量没有被赋值的时候,默认值为nil。不再像OC中的不为变量赋值就默认为nil或者0。那么Optional类型的变量要怎么声明呢?就是利用!和?两个符号。
当我们声明一个变量时,只要在类型后面加上一个?或者!,这个变量就是Optional类型的变量了。例如
上图中两个变量就是Optional类型,图中的变量声明并没有为其赋值,那么现在的两个变量就默认为nil,在使用的时候为其初始化即可。要注意的是,使用?声明的变量,在以后的使用,调用中,要一直在变量名后面加上?,用以确保安全性,如果变量有值(optional.some),就正常调用其值或者方法。如果变量没有值,便是optional.none,便会跳过这一步操作。否则会报错。当然也可以在变量后面加上 ! ,意思就是这个变量一定是有值的,放心用吧。如图所示使用
错误用法(使用optional变量,没有在optional类型变量后边加?或者!)
如上所述,optional类型变量每次调用都要加上?进行判断,保障了安全性,却令人感觉很麻烦。
所以如果我们能够确定这个optional变量以后的使用中一定是有值的,那么在声明的时候就要使用 ! 了。如图
如上图这样声明依旧是声明的optional类型变量,只是这样声明意思就是,“以后我调用这个变量的时候,这个变量一定不是nil的”,可以直接调用,就免去了前面所说每次调用都要加上一个?判断的麻烦,但是如果变量为空,就会直接报错(?会跳过这一步操作,不报错)(UI控件可以在声明的时候使用!声明)
as, as?, as!类型转换操作符
as
有保证的类型转换,但是只限定于子类向父类(向上转型)类型转换。不能进行向下转型。
as!
强制转换操作,向下转型,父类向子类进行类型转换。是一个不被保证的转换,可能会因为转型失败而导致报错崩溃。
as?
类型转换成功的话,就返回目标类型的值(但实质上还是optional),如果类型转换失败,就返回nil。