本人刚接触Swift的学习,在学习到可选类型的时候对?和!的使用有些不太明白的地方,晚上百度了好多,基本上都是说怎么样,和在什么时候用,这些说的东西确实很用,也都是对的,
- ?声明的变量在不拆包的情况下可以任意使用,不用担心 nil 带来的崩溃,而强制拆包的时候要使用绑定的方式判断是否是 nil
- 但是!声明的变量使用的时候会自动拆包,所以在使用的不能有位nil的时候,否则会报错,但是我们却可以赋值给变量为 nil ,所以使用的时候一定要小心
可选类型:拆包的话需要使用!强制拆包
var btn :UIButton? // 默认btn = nil
隐式可选类型:拆包自动,使用时便自动拆包
var edt :UITextField! // 默认edt = nil
对于 !和 ?个人使用心得 一:
对于选择类型的变量,在使用的时候要加上?或!,这样才能获取到内部一些属性, 但是两个的区别在于,使用 ?可以使用对应属性,但是却没有拆包,也正因为没有拆包,如果 变量值是 nil 不会报错, 使用 !其实就是直接强行拆包,所以肯定能使用变量的内部属性,但是这样因为swift的特性,如果变量值为 nil ,那么程序会崩溃 所以如果不需要使用可选变量的实际值的情况下,最好使用 ?去调用 变量的 方法或属性
// 定义一个类类型的变量
class Animal {
func gainResolution() -> Resolution? {
return nil
}
}
var res = animal.gainResolution()
// 这里使用 ?并非解包,并且可以使用对象属性,也不会担心nil造成的崩溃问题
res?.height = 500
下面是在下疑惑的一点和自己的猜想, 我们会发现在使用的时候!声明的变量和不设置可选类型使用时一样的,那我们为什么要使用!来声明为可选变量呢,这不是多此一举吗,网上查了好多资料也没有人说明这一点。
下面说一下对于声明变量的时候使用 !的个人体会:
** ! 声明的可选变量为nil的时候虽然不能直接使用,但是是可以被赋值为nil的,并且编译和运行都不会报错,所以个人理解:在定义变量时 !的使用主要在于对一些变量可能需要接受 nil 的情况考虑,但是在使用的时候会重新赋值或者强转为?形式变量,对于网上那些说使用!的变量就必须赋值为非 nil ,他们只说了一半,并且也可以通过if let aa = mm
和guard mm != nil else
来判断 是否为nil,!主要作用其实就是为了减少,在使用?时书写!的次数,并且强调这个变量使用的时候我们要想着给他赋值**
个人感觉!的使用有些鸡肋,希望大神们多多指教!