筆記摘要(十二)--Swift3.0之錯誤處理and類型轉換

錯誤處理

  • 表示并拋出錯誤

    • 在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中使用isas操作符實現。也可以用來檢查一個類型是否實現了某個協議。

  • 檢查類型

    用類型檢查符is來檢查一個實例是否屬于特定子類型。若實例屬于那個子類型,返回true,否則返回false。

  • 向下轉型

    當類型的一個常量或變量可能在幕后實際上屬于一個子類。當確定是這種情況時,可以嘗試向下轉到它的子類型,用類型轉換操作符as?as!

    轉換沒有真的改變實例或它的值。根本的實例保持不變:只是簡單的把它作為它被轉換成的類型來使用。

  • Any和AnyObject的類型轉換

在你的代碼里使用你期望的明確類型總是更好的。

AnyObject可以表示任何類類型的實例。
Any可以表示任何類型,包括函數類型。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容