[swift 進階]讀書筆記-第八章:錯誤處理 C8P5 錯誤和函式引數

liaoWorking在掘金發表於2019-03-26

錯誤處理 Error Handling

8.5 錯誤和函式引數 Errors and Function Parameters

本小節主要對下面兩個demo的統一抽象封裝引出來的一些思路。 1.檢視某一系列檔案的有效性 2.看一個數字陣列中所有數字是不是都不是質數

因為檢查是不是質數不會報錯,而檢查檔案可能會throws異常,從而引出rethrow關鍵字。

Demo1.一系列檔案有效性的檢查

檢查一個檔案的有效性checkFile方法應該有三種情況,有效無效檢查出錯 Demo中 用一個for迴圈確認每一個檔案的有效性,遇到無效檔案或者檢查出錯都會提前退出迴圈

///檢查檔案有效性的方法
func checkFile(filename: String) throws -> Bool 


func checkAllFiles(filenames: [String]) throws -> Bool { 
    for filename in filenames {
        guard try checkFile(filename: filename) else { return false } }
    return true
}
複製程式碼
Demo2.檢查一個數字陣列中是否含有質數 和Demo1相似,但不會throws異常
func checkPrimes(_ numbers: [Int]) -> Bool { 
    for number in numbers {
        guard number.isPrime else { return false } 
    }
    return true
}
checkPrimes([2,3,7,17]) // true
checkPrimes([2,3,4,5]) // false
複製程式碼

作為一個優秀的高階開發工程師(碼農。。) 肯定會對這兩個高度相似的方法是做一個完美的封裝

我們暫定封裝的方法方法名叫all(), all方法的引數是一個判斷條件是否滿足的函式

extension Sequence {
    /// Returns `true` iff all elements satisfy the predicate 
    func all(condition: (Iterator.Element) -> Bool) -> Bool {
        for element in self {
            guard condition(element) else { return false }
        }
        return true
    } 
}
複製程式碼
下面我們開始享受我們封裝完之後的戰果了。
檢視是否有質數 一行程式碼搞定。
func checkPrimes2(_ numbers: [Int]) -> Bool { 
    return numbers.all { $0.isPrime }
}
複製程式碼

Rethrows 關鍵字


下面問題就來了,檢視有限檔案時可能會異常。這個封裝不好使啊~ 這個時候我們可以使用rethrows關鍵字

rethrows關鍵字作用: 告訴編譯器,這個函式只會在它的引數函式拋錯時拋錯 編譯器可以避免我們一定要用try呼叫。

extension Sequence {
    func all(condition: (Iterator.Element) throws -> Bool) rethrows
-> Bool {
        for element in self {
            guard try condition(element) else { return false } 
        }
        return true
    } 
}
複製程式碼

上面檢查質數的Demo不受影響,而且檢查檔案有效性就可以像下面這樣寫了

///有try了
func checkAllFiles(filenames: [String]) throws -> Bool { 
    return try filenames.all(condition: checkFile)
}
複製程式碼

知識點:標準庫中序列和集合幾乎所有可以接收函式做引數的函式都被標記成rethrows了。 這樣做就很穩了~

over~

文章原始檔地址,大家如果有更好的想法和觀點歡迎交流

相關文章