錯誤處理
-
表示并拋出錯誤
在Swift中,錯誤用符合
Error協(xié)議
的類型的值來表示抛丽;這個空協(xié)議表明該類型可以用于錯誤處理亿鲜。Swift的枚舉類型尤為適合構建一組相關的錯誤狀態(tài)蒿柳,枚舉的關聯(lián)值還可以提供錯誤狀態(tài)的額外信息垒探。
-
拋出錯誤使用
throw
關鍵字圾叼。enum VendingMachineError: Error{ case InvalidSelection case InsufficientFunds(coinsNeeded: Int) case OutOfStock } throwVendingMachineError.InsufficientFunds(coinsNeeded: 5)
-
處理錯誤
- 用
throwing 函數(shù)
傳遞錯誤
- 用
為了表示一個函數(shù)夷蚊、方法或構造器可以拋出錯誤,在函數(shù)聲明的參數(shù)列表之后加上throws
關鍵字筋现。一個標有throws關鍵字的函數(shù)被稱作throwing函數(shù)矾飞。如果這個函數(shù)指明了返回值類型凰慈,throws關鍵詞需要寫在箭頭(->)的前面微谓。
一個throwing函數(shù)可以在其內(nèi)部拋出錯誤豺型,并將錯誤傳遞到函數(shù)被調(diào)用時的作用域姻氨。
任何在某個非throwing函數(shù)內(nèi)部拋出的錯誤只能在函數(shù)內(nèi)部處理肴焊。
-
用do-catch處理錯誤
可以使用一個do-catch語句運行一段閉包代碼來處理錯誤娶眷。如果在do子句中的代碼拋出了一個錯誤届宠,這個錯誤會與catch子句做匹配豌注,從而決定哪條子句能處理它每聪。
將錯誤轉(zhuǎn)換成可選值
可以使用try?
通過將錯誤轉(zhuǎn)換成一個可選值來處理錯誤齿风。如果在評估try?表示式時一個錯誤被拋出聂宾,那么表達式的值就是nil系谐。
禁用錯誤傳遞
當某個throwing函數(shù)實際上在運行時是不會拋出錯誤時纪他,可以在表達式前面寫try!
來禁用錯誤傳遞茶袒。這會把調(diào)用包裝在一個不會有錯誤拋出的運行時斷言中薪寓。如果真的拋出了錯誤向叉,你會得到一個運行時錯誤母谎。-
指定清理操作
可以使用
defer語句
在即將離開當前代碼塊時執(zhí)行一系列語句奇唤。比如匹摇,可以用來確保文件描述符得以關閉冗栗,以及手動分配的內(nèi)存得以釋放。defer語句將代碼的執(zhí)行延遲到當前的作用域退出之前。
即使沒有涉及到錯誤處理棉钧,你也可以使用defer語句宪卿。
類型轉(zhuǎn)換
類型轉(zhuǎn)換在swift中使用
is
和as
操作符實現(xiàn)。也可以用來檢查一個類型是否實現(xiàn)了某個協(xié)議休溶。
-
檢查類型
用類型檢查符
is
來檢查一個實例是否屬于特定子類型扰她。若實例屬于那個子類型孽尽,返回true,否則返回false杉女。 -
向下轉(zhuǎn)型
當類型的一個常量或變量可能在幕后實際上屬于一個子類宠纯。當確定是這種情況時婆瓜,可以嘗試向下轉(zhuǎn)到它的子類型,用類型轉(zhuǎn)換操作符
as?
或as!
猴蹂。轉(zhuǎn)換沒有真的改變實例或它的值磅轻。根本的實例保持不變:只是簡單的把它作為它被轉(zhuǎn)換成的類型來使用谆膳。
Any和AnyObject的類型轉(zhuǎn)換
在你的代碼里使用你期望的明確類型總是更好的漱病。
AnyObject
可以表示任何類類型的實例。
Any
可以表示任何類型注盈,包括函數(shù)類型。