[swift 進階]讀書筆記-第八章:字串 C8P1 result型別

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

第八章:錯誤處理

8.1 Result型別 Result Type

什麼是Result 型別

Result 型別並不是Swift標準庫中的型別。就是一個簡化成功和失敗兩種情況的列舉。 個人感覺更像是一種程式設計思想。

書中大部分篇幅是講try catchthrows 相關的東西 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型別有一個更好的理解。

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

相關文章