前言
在閱讀基礎語法的時候,在可選(optional)這個概念上琢磨時,我可以很清楚的知道一件事情:
”?”(問號)的做用是用來表達一個值的不確定,不論是在設定變數時,我們有類似下面的宣告:var name:String?代表我們不確定name這個參數未來的值會不會是String或nil,也就是說,”?”作為是一種表達可能性、未知的語意,它是一種用來處理時間差的有無的所產生的功能。
我可以很清楚的知道”?”的功能何在,但另外一個叫做”!”的東西,就令我有點困惑了,所以,以下我會針對“!”來做一些小討論。
正文
簡單解釋強制解包的兩種結果
假若我們今天的參數為name,而賦予參數的值為「有」的狀態,裡面是”Adam”,那麼藉由強制解包來實作時,我們把name用“!”處理,就會發現它可以打印出值來。

第二種情形,是假若為「沒有」的狀態,裡面是nil,那麼強制解包來實作的時候,我們用”!“來處理,就會發現它會發生執行中斷的情形,因為Swift會自動判斷這個程式可不可以run。


於是我們就在結果欄可以找到Fatal error了。
總而言之,強制解包的用途,如果你很確定它「有值」,那麼強制解包執行後,一切都會安好,假若「沒有值」,那麼程式就無法動,一翻兩瞪眼。
依照這個基本邏輯下去行事來判斷,依該在使用強制解包上可以89不離10的操作它。
隱式可選解包(Implicitly unwrapped optionals)
不過,驚嘆號的實作還有另一種情況:叫做隱式可選解包(Implicitly unwrapped optionals)
Like regular optionals, implicitly unwrapped optionals might contain a value or they might be
nil
. However, unlike regular optionals you don’t need to unwrap them in order to use them: you can use them as if they weren’t optional at all.
隱式可選項解包可能包含一個值或他們可以是空值(nil),就像制式的可選項一樣,然而,不像制式的可選項一樣,你不需要為了使用而額外解包他們,你可以使用他們就像他們不是可選項一樣。
做個實例:

假若有值,那麼name:String就算扣上驚嘆號,也不會怎麼樣,一切完好,別的參數要指向它也很ok。
但假若沒有值,那麼就算name:String扣上了驚嘆號,Swift表面上雖然不會怎麼樣,但如果你要在其他的常數、變數中使用它,就會報錯了:

總而言之,言而總之,既然問號的使用是表達一種不確定、可能地狀態,那驚嘆號就相對的代表了一種「確定有」的自信,無論是強制解包或是隱式解包。
因為他們都共同的指出一件事情:假若它們是空值,但你又用強制解包來打包票裡面有東西,那當然就會開天窗啊(Fatal error),這會是個一番兩瞪眼的說詞了。
希望「驚嘆號」與「問號」的基本邏輯能讓你更加釐清自己在選擇使用符號表達值的狀態的時候,能處理好值的「有與無」的問題。