Optional的?or !
1、聲明為Optiopnal(?)
- Optional的本質是枚舉enum:它可以有值,也可以沒值(nil);
- 聲明為Optional,隻需要在類型的後面緊跟
;?
- 當Optional沒有值時,将傳回nil;
- 當Optional有值時,将進行拆封取值(unwrap),然後對拆包後的值執行後面的操作;
2、聲明為非Optiopnal(!)
- 使用感歎号!表示拆封取值(表示I am sure it has a value);
- 強制認為有值,如果為nil時則會觸發運作時錯誤(Compile找不到你說的那個value);
你可以這麼認為:
1、Optional中有兩個值,可能為none,也可能為其它值;
2、
?
代表當你不确定類型值是否為空,是以值為none時傳回nil;不為none時傳回Optional中的值;
3、
代表你确定類型中一定會有值,是以值為none的時,運作會報錯;不為none時傳回Optional的值;
!
3、定義:那我們來看一下Optional的本質:
Optional類型變量的真實值是被封裝起來的,包裝在其枚舉值Some中;
enum Optional<T> : LogicValue, Reflectable {
case None
case Some(T)
init()
init(_ some: T)
/// Allow use in a Boolean context.
func getLogicValue() -> Bool
/// Haskell's fmap, which was mis-named
func map<U>(f: (T) -> U) -> U?
func getMirror() -> Mirror
}
4、差別:Optional 和 非Optional
在聲明一個Optional類型變量時如果沒有賦初始值,那麼預設為nil;
//未被初始化,但是是一個Optional類型,為nil
var str: String?
str //輸出nil
//未被初始化,也不是Optional類型
var str2: String
str2 //使用時出錯
除了基礎的Optional含義,還有Optional Chaining 與 Optional Binding,這些的話,就另外寫文章來說啦;
或者可以到Swift開發者頁面:
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html