錯誤處理
-
表示并拋出錯誤
在Swift中,錯誤用符合
Error協議
的類型的值來表示;這個空協議表明該類型可以用于錯誤處理。Swift的枚舉類型尤為適合構建一組相關的錯誤狀態,枚舉的關聯值還可以提供錯誤狀態的額外信息。
-
拋出錯誤使用
throw
關鍵字。enum VendingMachineError: Error{ case InvalidSelection case InsufficientFunds(coinsNeeded: Int) case OutOfStock } throwVendingMachineError.InsufficientFunds(coinsNeeded: 5)
-
處理錯誤
- 用
throwing 函數
傳遞錯誤
- 用
為了表示一個函數、方法或構造器可以拋出錯誤,在函數聲明的參數列表之后加上throws
關鍵字。一個標有throws關鍵字的函數被稱作throwing函數。如果這個函數指明了返回值類型,throws關鍵詞需要寫在箭頭(->)的前面。
一個throwing函數可以在其內部拋出錯誤,并將錯誤傳遞到函數被調用時的作用域。
任何在某個非throwing函數內部拋出的錯誤只能在函數內部處理。
-
用do-catch處理錯誤
可以使用一個do-catch語句運行一段閉包代碼來處理錯誤。如果在do子句中的代碼拋出了一個錯誤,這個錯誤會與catch子句做匹配,從而決定哪條子句能處理它。
將錯誤轉換成可選值
可以使用try?
通過將錯誤轉換成一個可選值來處理錯誤。如果在評估try?表示式時一個錯誤被拋出,那么表達式的值就是nil。
禁用錯誤傳遞
當某個throwing函數實際上在運行時是不會拋出錯誤時,可以在表達式前面寫try!
來禁用錯誤傳遞。這會把調用包裝在一個不會有錯誤拋出的運行時斷言中。如果真的拋出了錯誤,你會得到一個運行時錯誤。-
指定清理操作
可以使用
defer語句
在即將離開當前代碼塊時執行一系列語句。比如,可以用來確保文件描述符得以關閉,以及手動分配的內存得以釋放。defer語句將代碼的執行延遲到當前的作用域退出之前。
即使沒有涉及到錯誤處理,你也可以使用defer語句。
類型轉換
類型轉換在swift中使用
is
和as
操作符實現。也可以用來檢查一個類型是否實現了某個協議。
-
檢查類型
用類型檢查符
is
來檢查一個實例是否屬于特定子類型。若實例屬于那個子類型,返回true,否則返回false。 -
向下轉型
當類型的一個常量或變量可能在幕后實際上屬于一個子類。當確定是這種情況時,可以嘗試向下轉到它的子類型,用類型轉換操作符
as?
或as!
。轉換沒有真的改變實例或它的值。根本的實例保持不變:只是簡單的把它作為它被轉換成的類型來使用。
Any和AnyObject的類型轉換
在你的代碼里使用你期望的明確類型總是更好的。
AnyObject
可以表示任何類類型的實例。
Any
可以表示任何類型,包括函數類型。