在我們寫程式時 , 你會發現在某些情況下 , 變數及常數有時是不會有初始值的狀態 ,
比如說我們去釣魚時宣告變數SamGetFish儲存Sam去釣魚的數目
但Sam有可能要去釣魚時 , 剛好碰到氣候不佳 , 而取消行程 , 這跟釣到0條魚是不一樣的 ,
那要儲存什麼樣的內容才能表示氣候不佳而取消行程呢 ? 應該不會是0 , 釣到0條魚跟
取消行程是不一樣的 , 我們希望在程式裡判斷是否取消行程。
也許儲存-1是個不錯的方式,畢竟不可能有人會釣-1條魚。將SamGetFish的內容預設
為-1,待Sam釣完魚後,再改為他實際釣到的數目。如此我們即可透過比對分數是否
等於-1,判斷Sam是否有釣到魚。
但這種做法其實有很大的問題:
1.容易誤解。
-1本身是個真實存在的數字,我們以它表達還沒有釣魚數目的狀態其實不太合理。
閱讀程式碼時,它不只無法直覺傳達出Sam還沒有去釣魚,甚至有可能讓人誤會。
2.修改容易出問題。
當我們想要採用另一個數字表示沒有分數的狀態,比方-2,此時必須十分仔細地檢查
程式碼,確保所有比對SamGetFish的地方都換成跟-2比較,只要稍有遺漏即會產生
錯誤的結果。
剛才的問題,變數(常數)無法表達沒有內容的狀態。在Swift推出了optional,這問題
總算有解,Optional 的中文意思是「非必要的,可選擇的」,而在 Swift 程式裡,
所有宣告的變數(常數),不管型別是什麼,都可以幫忙増加optional的屬性,
使其成為一個可以有值,也可以無值的特別變數(常數)。
一個 optional 的變數(常數),可以被設定為 nil,表示它處於無值的狀態
有了 optional 表達無值的狀態後,以後只有nil才代表沒有內容。數字 0 和空字串 “”
都還是有內容,跟 nil是不一樣的。
學會 optional 後,未來我們在宣告變數(常數)時,應當在宣告時就想清楚,思考它是否
可能無值,是否需要設為 optional。
如果想預防因為從無值的 optional 變數(常數)強迫取值造成的閃退,只要在取值前先用
if 判斷它是否不等於 nil。若是不等於 nil,即表示目前有值,才可放心地取值。
var samGetFish:Int? = 5
if samGetFish != nil {
samGetFish = samGetFish!
}