本小節主要講了在遇到異步耗時操做
可能拋出錯誤
時候的處理。(書中也提到了並無什麼完美
的處理,只有對應不一樣場景相對合適
一些的處理方式)git
對這個知識點作一個簡單瞭解就行。github
假設方法compute
是一個耗時操做
,通常咱們會使用閉包
去異步的拿到返回值。閉包
func compute(callback: Int -> ())
複製代碼
那麼,若是。 compute方法可能會拋錯捏
? 並且正好咱們想要拿到這個錯誤的詳細信息
。app
通常狀況下咱們會這樣寫異步
func compute(callback: Int throws -> ())
複製代碼
一眼望去老鐵這樣寫妥妥沒毛病
啊(哈哈其實我也是這麼以爲的。)
but!!!函數
這樣寫如今並非指計算可能失敗
,而是表示回調自己可能會拋出錯誤
。spa
可選值
和 Result
做用於類型
,而 throws
只對函數
起效。將一個函數標註爲 throws 意味着這個函數可能會失敗.code
咱們真正須要的是用一個Result 來封裝 Int 參數
的函數去解決咱們上面的需求。get
func compute(callback: Result<Int> -> ())
複製代碼
同步方法中使用throws了
,再去你的異步函數中使用Result 會讓你的API使用起來更加困難
。若是你只有一個回調
的話,使用下面這種會友好一些:同步
func compute { (theResult: () throws -> Int) in
do {
let result = try theResult()
print ( result )
} catch {
print("An error happened: \(error)")
}
}
複製代碼