前言
在上篇描述完函式的基本語法後,可以大致上知道函式可以分成內部(可設定內容)、外部(呼叫內部的功能),這兩者構成了Swift函式的基本使用,以及除此之外,函式還有其他的小功能,如:默認參數(default parameter)、可變參數函式(variadic function)
那麼本篇會聊到的,還有一種函式,叫做拋出函式,它經常的設定在面對錯誤的產出上。
正文
拋出函式(throwing function)
100Days of Swift,大概對拋出函式有了這樣的概念的描述:
Sometimes functions fail because they have bad input, or because something went wrong internally. Swift lets us throw errors from functions by marking them as throws
before their return type, then using the throw
keyword when something goes wrong.
翻譯翻譯:有時候函式的失敗,是因為他們在輸入的時候就發生錯誤了,或者有些東西在內部就錯了,Swift讓我們藉由標記throws拋出錯誤,因此我們使用throw這個關鍵字來表示有些東西錯了。
不過,在執行拋出錯誤之前,我們大抵上會先設定,什麼東西是錯誤的,因此,我們會先設置一個枚舉(Enum)來放置這些錯誤的提示,如下:

枚舉在設置這些錯誤的時候,會先等於一個Error的協定(Protocol,
這個在之後會談到),然後在「passwordProblem」的下面描述各式不同類型的錯誤。
而function則在這些錯誤的範例下,以拋出(throws)的關鍵字定義這個函式的運作方式,而如果都沒有符合的條件,就以拋出(throw)這個關鍵字來引入枚舉裡面定義錯誤問題的項目。
不過,拋出問題,總是要解決問題吧?
所以在拋出問題後,就會需要捕獲拋出的問題,因此,會使用do…catch的方式來把問題解決:
處理拋出的錯誤(do…try…catch)
我們先來問一個問題:假若我們沒有處理錯誤,會發生什麼問題呢?
我這裡有一個從其他地方引述的相關解答:
如果遇到錯誤時會將錯誤拋出並傳遞至錯誤處理的地方,目前尚未定義怎麼處理錯誤,所以這時 Swift 會自動處理,不過這可能會導致程式中止,所以我們還是自行定義錯誤處理的方式。
而Swift針對錯誤,就有它處理的方式:
Swift 使用do-catch
語句來定義錯誤的捕獲(catch
)及處理,每一個catch
表示可以捕獲到一個錯誤拋出的處理方式。

總之,就上述的例子,try後面接的是拋出函式的內容,以及要置入的值,後面的catch就是針對錯誤的返回的處理。如果要用公式來描述,會是下面這個樣子:

總之,這大概會是關於拋出函式最基礎的樣子,大致上再複述一下上面提到的內容:
- 會先定義好錯誤的可能項目:枚舉Enum會是一個不錯的方式
- 寫一個拋出函式,註記好throws的部分,以及從中延伸出的throw的內容
- 再用do…try…catch去處理錯誤的內容。
小記:本篇會有幾個基本小問題:1.協定(Protocol)的理解2.其實可以更多的搭配class、struct的演示,不過基於這些東西都還沒有說到,所以就先不提。