无聊又看了看Alamofire的源码,其中有个叫Result的文件,真的优秀。
看文件名字就知道这个是用来处理请求结果的,话不多说先看源码。
public enum Result<Value> {
case success(Value)
case failure(Error)
}
处理返回结果无非就是成功或者失败返回来的参数。这个用Swift的枚举再好不过了(Swift的枚举真的很优秀)。
看代码就是一个名为Result的枚举,带了一个Value的泛型。枚举里面就是success和failure,请求的结果就是如此。
不同的就是success带了一个叫Value的泛型参数,因为请求成功可能会有不同的结果,用泛型再好不过。而failure里面是一个Error的参数,私以为也可以用一个泛型,因为可能自己也会自定义Error,不过在这个框架里面好像不需要这样。
这样就完美的表示出了Result的作用,简单精悍。
我们还会要处理返回的参数,作者还是很贴心的。
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函数,这个函数里面有一个闭包,可以在这个闭包里面处理成我们想要的类型再用Result返回。就像Swift数组的map函数一样,当然用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)
}
}
和数组的flatMap降维和排除nil的功能不同,毕竟这不是个数组是个枚举。这里是transform失败转换成Result.failure返回,成功则和map一样。有空可以去读一下Swift数组的源码。
哦,别人的代码看着就很舒服,别人的..........
网友评论