问号(?)
声明时添加?,告诉编译器这个是Optional的,如果声明时没有手动初始化,就自动初始化为nil
在对变量值操作前添加?,判断如果变量时nil,则不响应后面的方法。
叹号(!)
声明时添加!,告诉编译器这个是Optional的,并且之后对该变量操作的时候,都隐式的在操作前添加!
在对变量操作前添加!,表示默认为非nil,直接解包进行处理。
举例:
var btn1 : UIButton?
var bnt2 : UIButton!
override func viewDidLoad() {
super.viewDidLoad()
btn1?.setTitle("OK", for: UIControlState.normal)
bnt2.setTitle("NO", for: UIControlState.normal)
}
很明显,感叹号声明的属性在使用的时候已经隐式强制解包了。
不管是问号声明属性还是感叹号声明属性,他们声明的都是
可选类型
,都会在声明的时候如果没有手动初始化,swift会自动将该变量初始化为nil。主要区别在于,使用的时候会不会主动解包。