2018-10-28

無聊又看了看Alamofire的源碼,其中有個叫Result的文件,真的優(yōu)秀。
看文件名字就知道這個是用來處理請求結(jié)果的,話不多說先看源碼。

public enum Result<Value> {
    case success(Value)
    case failure(Error)
}

處理返回結(jié)果無非就是成功或者失敗返回來的參數(shù)。這個用Swift的枚舉再好不過了(Swift的枚舉真的很優(yōu)秀)。

看代碼就是一個名為Result的枚舉,帶了一個Value的泛型。枚舉里面就是success和failure,請求的結(jié)果就是如此。

不同的就是success帶了一個叫Value的泛型參數(shù),因為請求成功可能會有不同的結(jié)果,用泛型再好不過。而failure里面是一個Error的參數(shù),私以為也可以用一個泛型,因為可能自己也會自定義Error,不過在這個框架里面好像不需要這樣。

這樣就完美的表示出了Result的作用,簡單精悍。

我們還會要處理返回的參數(shù),作者還是很貼心的。

    public func map<T>(_ transform: (Value) -> T) -> Result<T> {
        switch self {
        case .success(let value):
            return .success(transform(value))
        case .failure(let error):
            return .failure(error)
        }
    }

作者寫了一個帶泛型的map函數(shù),這個函數(shù)里面有一個閉包,可以在這個閉包里面處理成我們想要的類型再用Result返回。就像Swift數(shù)組的map函數(shù)一樣,當然用map就會有flatMap

    public func flatMap<T>(_ transform: (Value) throws -> T) -> Result<T> {
        switch self {
        case .success(let value):
            do {
                return try .success(transform(value))
            } catch {
                return .failure(error)
            }
        case .failure(let error):
            return .failure(error)
        }
    }

和數(shù)組的flatMap降維和排除nil的功能不同,畢竟這不是個數(shù)組是個枚舉。這里是transform失敗轉(zhuǎn)換成Result.failure返回,成功則和map一樣。有空可以去讀一下Swift數(shù)組的源碼。

哦,別人的代碼看著就很舒服,別人的..........

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容