[Swift] optional 和 unwrap 以及 as

以下是介紹Swift的optional和forced unwrap等等的語法,這算是swift裡面初學比較麻煩的東西,可以參考這一篇文章
首先是optional:
let nav? = self.navigationController
假設self是一個UIViewController,如果他是在一個navigation stack內,那他的navigationController特性會自動被設定一個UINavigationController,相反來說,就可能是一個空值。
有些值可能是空的,你就會設定?在該常數/變數的後面,代表裡面可以是一個nil值,而?其實是一個enum,裡面放了空值和任何的type的值(這是你在賦值的時候設定的)。
在以前的obj-c裡面,物件可以回傳nil作為表示他沒有合法的值,但如果不是物件,你就必須設定一個特殊數值(像是0或是-1)代表你沒有合法的值,然而一個int類型的變數代表不合法時,可能你會設定成-1或是0,這可能會在你的code中的檢查裡面被忽略,從而導致bug,所以int?類型讓你有更高的型別安全性。
對於optional,你可以使用if去檢查他是否為nil,然後你如果確定裡面有值,你可以使用!把該值給打開使用,比方以下的例子:
let employeeHeight: int? = self.employee.height
if employeeHeight != nil {
    println("Height= \(employeeHeight!)")
}
你在特性裡面存放的員工資料,可能沒有身高的設定,所以你給他int?型別,然後使用if來檢查,如果非nil,那就打開該optional,把該值拿出來。
然而,在不確定的情況下使用!打開optional,可能會導致runtime錯誤,這點請注意,配合著if來使用才能確保安全。

Optional Binding

這個技術是讓你確認optional真的帶有值之後,可以暫時性的來使用該值的技巧,配合前面的if,格式如下。
if let constantName = someOptional {
    statements
}
將你的optional放在someOptional的位置,然後statament內要使用的常數名稱寫在constantName
當你的optional有值的話,if就會把optional給打開,把值放到constantName裡面去。
if let也可以放入一個以上的optional,只要用逗號去分開描述句就好。

Implicitly unwrapped optionals

!是用在你確定該optional一定有值的情況下。只要你能確定該optional有值,使用時在他後面接!,就會強迫打開該optional。
比方說有些optional在你初次宣告賦好值之後,你就確定它有值了,為了避免每次使用的時候都要!去打開,你可以在你初次宣告賦值時直接在型別後面接!,這意思就是說,這個optional型別我確定有值,請直接開封使用:
let assumedStr: String! = "I have value."
let implicitStr: String = assumedString
反之,如果你是這樣寫的話:
let assumedStr: String? = "I have value."
那你每次要使用assumedStr的時候你都必須加上!,就會變得很累贅。
let implicitStr: String = assumedString!
所以,!的使用有兩種
  1. 一般操作下,你百分百確定該optional有值,於是打開optional
  2. 宣告一個optional時,就直接說這是一個一定有值的optional
另外,?是用在你不確定optional有無值的情況下。

as and as?

as其實是轉型別的意思,比方說你有一個custom的UIViewController叫做MyViewController,當你要從UIViewController轉型成MyViewController時,就使用它。
let myVC = viewController as? MyViewController
那麼as?是什麼意思呢?比方說你得到一個viewController,執行其實你不能百分百確定viewController可以成功轉型成MyViewController,於是as?允許回傳一個nil值,所以上面那句其實是得到一個optional的MyViewController型別的常數。
所以上面那句話可以這樣講:viewController是不是MyViewController型別呢?如果是的話你就可以得到optional的MyViewController型別常數,反之,你會得到nil。
另一方面,如果你百分之百確定可以成功轉型別,那就是用as,很簡單吧?比方說:
let number = 72/2.0 as Int
這是把35.5轉型成Int,而你知道這一定可以轉型,所以沒有任何問題!
到這邊你就大概掌握了swift裡面最重要的部分,祝各位學習swift順利。

留言