第八章:錯誤處理
8.1 Result型別 Result Type
什麼是Result 型別
Result 型別並不是Swift標準庫中的型別。就是一個簡化成功和失敗兩種情況的列舉。 個人感覺更像是一種程式設計思想。
書中大部分篇幅是講try
catch
和throws
相關的東西 Result 型別
相關講的不多。 為了能簡單高效的理解Result型別 下面會直接拿使用場景
來講Result相關的知識點。
首先我們先說說swift中可選值Optional的本質
:
其實是一個包含.Some 和.None兩個成員的列舉值
。
///Optional的本質
enum Optional<T> : Reflectable, NilLiteralConvertible {
case None
case Some(T)
}
複製程式碼
Result型別和可選值Optional非常相似
。
使用場景
在通常的網路請求中,我們都是通過success和failed兩個閉包來傳遞結果
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
[session GET:@"需要請求的url" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"請求成功");
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"請求失敗");
複製程式碼
}];
這個時候使用result型別 就可以用一個物件
去處理這兩種情況
下面我們來手動實現一個自己的result型別。
1、我們先定義成功和失敗的兩個協議:
成功的協議,可以擴充套件成功的物件需要的任何東西。
LWSuccessedProtocol
失敗的協議,可以擴充套件失敗的物件需要的任何東西。
LWFailedProtocol
2、我們建立一個LWResult列舉
Result列舉有2個泛型,T繼承LWSuccessedProtocol,Error繼承LWFailedProtocol。列舉有2種情況,一種是成功(success),一種是失敗(failure),還有對應的初始化。 我們就完成了一個Result型別的定義了。
public protocol LWSuccessedProtocol {
}
public protocol LWFailedProtocol {
}
public enum LWResult<T:LWSuccessedProtocol, Error:LWFailedProtocol> {
case success(T)
case failure(Error)
public init(value:T) {
self = .success(value)
}
public init(error:Error) {
self = .failure(error)
}
}
複製程式碼
自定義Result的具體使用:在拿到網路請求的回撥之後去處理拿到的資料 注:下面Demo中completion為result型別的閉包
if 網路請求成功 {
let successResult = LWSuccess()
completion(TDWResult(value: successResult))
} else {
let failResult = LWFailure()
completion(TDWResult(error: failResult))
}
複製程式碼
注:使用Moya作為專案網路請求框架同學一定對Result型別不陌生。Moya天生就是對Result型別良好的支援。 上面的Demo可以讓各位同學對Result型別有一個更好的理解。