基本了解
在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 ]最先更新 |
---|