基本了解
在Swift代碼會經常看到定義屬性或方法參數時類型后面會緊跟一個感嘆號( ! )或問號( ? ), 剛開始接觸Swift的童鞋就可能不太明白之代表什么意思,一頭霧水,開始凌亂了。
本文將帶你了解感嘆號( ! )與問號( ? )之謎,首先問號( ? )是可選類型,是用來處理值可能缺失的情況,也就是沒有值的情況(也就是OC中NULL); 感嘆號( ! )就是與之相反的, 就是一定有值(非可選類型),不存在空值的情況(OC中NULL)。
下面根據不同使用場景來進一步了解感嘆號( ! )與問號( ? )之謎
各個場景中的嘆號( ! )與問號( ? )
類的屬性
class MyClass {
var value: String!
var optionalValue: String? // defaulit is nil, 所有定義為可選類型的,可選值都是nil, 和數據類型沒有關系。
}
在
MyClass定義了2個屬性:value和optionalValue,其中optionalValue為可選類型;這表示value在使用之前一定是賦了值的(一定有值),optionalValue則有可能值缺失。下面先來看看幾個代碼片段來深入了解感嘆號( ! )與問號( ? )之謎
1. 下面代碼,在運行時初始化一個MyClass實例會發生什么呢?
class MyClass {
var value: String!
var optionalValue: String?
init() {
let _ = value.count
let _ = optionalValue?.count // 可選解析
}
}
程序會崩潰,報以下錯誤
Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
value是非可選類型,必須要有值,從代碼中看出value從賦值過。另外構造函數里的問號( ? )是指可選解析(弱解析),並不是指可選類型,這里要注意了
2. 下面代碼,在運行時初始化一個MyClass實例會發生什么呢?
class MyClass {
var value: String!
var optionalValue: String?
init() {
value = "this is string value."
let _ = value.count
let _ = optionalValue!.count // 強解析
}
}
程序會崩潰,和代碼片段1報一樣的錯誤
Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
大家肯定奇怪了明明
value已經賦值了,為什么還會崩潰,問題出在optionalValue屬性,不知道大家注意了沒有,此代碼的構造函數中optionalValue后面是感嘆號( ! ),而代碼片段1的構造函數中optionalValue后面是問號( ? )。這里的感嘆號( ! )是指強解析,你也可以理解為強制取值,但是optionalValue至定義后從未賦值過,也就是沒有值(特別注意:可選值不是值),自然也就和代碼片段1報一樣的錯
| 未完待續 ,我的個人博客 [ 雲博客BLOG ]最先更新 |
|---|
