2018-10-28

无聊又看了看Alamofire的源码,其中有个叫Result的文件,真的优秀。
看文件名字就知道这个是用来处理请求结果的,话不多说先看源码。

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

处理返回结果无非就是成功或者失败返回来的参数。这个用Swift的枚举再好不过了(Swift的枚举真的很优秀)。

看代码就是一个名为Result的枚举,带了一个Value的泛型。枚举里面就是success和failure,请求的结果就是如此。

不同的就是success带了一个叫Value的泛型参数,因为请求成功可能会有不同的结果,用泛型再好不过。而failure里面是一个Error的参数,私以为也可以用一个泛型,因为可能自己也会自定义Error,不过在这个框架里面好像不需要这样。

这样就完美的表示出了Result的作用,简单精悍。

我们还会要处理返回的参数,作者还是很贴心的。

    public func map(_ transform: (Value) -> T) -> Result {
        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(_ transform: (Value) throws -> T) -> Result {
        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数组的源码。

哦,别人的代码看着就很舒服,别人的..........

你可能感兴趣的:(2018-10-28)