無聊又看了看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ù)組的源碼。
哦,別人的代碼看著就很舒服,別人的..........