美文网首页
2018-10-28

2018-10-28

作者: 麻虾尔 | 来源:发表于2018-10-28 14:52 被阅读0次

    无聊又看了看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数组的源码。

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

    相关文章

      网友评论

          本文标题:2018-10-28

          本文链接:https://www.haomeiwen.com/subject/ryiptqtx.html