Swift開發之異常處理及斷言(一)

来源:http://www.cnblogs.com/Jepson1218/archive/2016/03/14/5277677.html
-Advertisement-
Play Games

本篇分兩部分:   在 OC 開發中,我們通常會將 error 置為 nil   在絕大多數情況下,這個方法並不會發生什麼錯誤,所以我們將 error 直接設置為 nil。但是出錯的時候可能就會無從下手進行調試。在 Swift 中引入了異常機制,這讓我們老牌程式員感到異常親切,因為在 java 或


本篇分兩部分:

  1、錯誤和異常處理

  2、Swift 中的斷言

 

1、錯誤和異常處理

在 OC 開發中,我們通常會將 error 置為 nil

NSError *error;
BOOL success = [data writeToFile: path options: options error: &error];
if(error) {
    // 錯誤信息
}

 

  在絕大多數情況下,這個方法並不會發生什麼錯誤,所以我們將 error 直接設置為 nil。但是出錯的時候可能就會無從下手進行調試。在 Swift 中引入了異常機制,這讓我們老牌程式員感到異常親切,因為在 java 或 C# 中我們會經常使用。但是與 java 不同的是,Swift 中用的是 do...catch 語法,然後在可能跑出異常的地方來用 try 進行修飾,而 java 中直接將可能拋出異常的代碼塊放到 try...catch 中。swift 相較 java 會更快速的鎖定異常代碼的行數,而 java 可能需要一步步調試才能發現 try...catch 中那句發生了錯誤,但我並不認為這是個優點,如果 Swift 中多處都會拋出同樣的異常,每句都去修飾的話會導致代碼異常臃腫。

enum LoginError: ErrorType {
    case UserNotFound, UserPasswordNotMatch
}
func login(user: String, password: String) throws {
    if 1 < 2 {
        throw LoginError.UserNotFound
    }
    if 2 > 1 {
        throw LoginError.UserPasswordNotMatch
    }
    print("Login successfully.")
}

do {
    try login("onevcat", password: "123")
} catch LoginError.UserNotFound {
    print("UserNotFound")
} catch LoginError.UserPasswordNotMatch {
    print("UserPasswordNotMatch")
}

 


 

2、Swift 中的斷言

  斷言(assertion)在 Cocoa 開發里一般用來在檢查輸入參數是否滿足一定條件,並對其進行“論斷”,用於提高開發人員之間的溝通效率。

 在判斷某些輸入參數是否滿足條件時,我們程式員通常用 if 這樣的條件控制來檢測,如果遇到無法繼續的情況就提前返回或跑出錯誤。但是這樣導致了運行時的額外開銷,對於像判斷輸入參數是否滿足條件這樣的情景,我們用斷言處理將會更好。

 swift 中為我們提供的斷言方法:

func assert(@autoclosure condition: () -> Bool,
 @autoclosure _ message: () -> String = default,
 file:StaticString = default,
 line: UInt = default)

 

舉一個簡單的例子,比如我們的年齡不能小於0歲:

func convertAge(age: Int) -> Int {
    assert(age < 0, "輸入的年齡不能小於0歲")
    return 0
}

let xiaoMingAge = convertAge(-10)

// 運行時錯誤:
// assertion failed:
// 輸入的年齡不能小於0歲

 

斷言最最基本的作用:

  在遇到無法處理的輸入時,運行會產生錯誤並拋出我們預設的信息來提醒調用這段代碼的工程師。

斷言的特點:

  與我們自定義的 NSLog 類似,它是一個開發時的特性,只有在 Debug 編譯的時候有效,而在運行時是不被編譯執行的,因此並不會消耗運行時的性能。這些特點使得斷言稱為面向程式員在調試開發階段非常適合的調試判斷,而在代碼發佈時,我們也不需要刻意去把這些斷言手動清除。

  如果我們想要在 Debug 模式下強制禁用斷言,在對應的 target 的 Build Setting 中,我們在 Swift Compiler - Custom Flags 中的 Other Swift Flags 中添加 -assert-config Release 來強制禁用斷言,或者 -assert-config Debug 來強制啟用斷言。(不建議這麼做)

 

註:OC 中的斷言函數 NSAssert 在 Swift 中已被移除。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • python利用or在列表解析中調用多個函數.py
  • 2.在定義常量的時候C語言中定義為const而JAVA中為final3.在JAVA聲明成員變數的時候,使用static來定義。4.在JAVA中的boolean類型只包括true和false,但是在C中非0為true,0為false5.在JAVA中byte、short、int、long其存儲空間分別為
  • 今天幫同學想用C實現數組的折半查找,本來演算法挺簡單的,可是折騰了好幾個小時才發現問題在哪,這個sizeof坑人不淺啊。 明白這裡了,附上一篇C實現折半的代碼  
  • 一、Java的特點:一次編譯,到處運行時間。   C語言在windows下執行:C源程式(.c)——>編譯 windows可執行文件(.exe)——>windows操作系統  Java語言:Java源文件——>編譯 Java位元組碼文件(.class)——>JVM虛擬機下 (能直接解釋Java位元組碼C
  • -->位元組碼解釋器工作就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,分支、迴圈、跳轉、異常處理、線程恢復等基礎功能都需要依賴計數器來完成。 -->為了線程切換後能恢復到正確的執行位置,每條線程都需要一個獨立的程式計數器,各條線程之間計數器互不影響,獨立存儲,我們稱這類記憶體區域為"線程私
  • 初學python第一天,希望自己真正瞭解電腦語言,並且做出成效。   寫下學習筆記,記錄學習進度,娛樂學習,不斷成長。   python詳細介紹:   python是什麼?運用到哪裡?有哪些在使用它? python是一門編程語言,可以運用到各種場景,基本大型公司都在用它,主要運用在網路編程方面。如
  • 這是個Linux上簡易的http伺服器實現,主要就是tcp socket 和 pipe管道cgi重定向. 解析http協議. 簡單的處理並反饋給客戶端.並附帶一個client.c 測試服務端. 比較簡陋 去掉註釋400行以下. 能夠幫我們加深web伺服器的理解.
  • Java是天生就支持併發的語言,支持併發意味著多線程,線程的頻繁創建在高併發及大數據量是非常消耗資源的,因為java提供了線程池。在jdk1.5以前的版本中,線程池的使用是及其簡陋的,但是在JDK1.5後,有了很大的改善。JDK1.5之後加入了java.util.concurrent包,java.u
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...