Skip to content

Latest commit

 

History

History
111 lines (67 loc) · 3.71 KB

8.1 result类型.md

File metadata and controls

111 lines (67 loc) · 3.71 KB

第八章:错误处理

8.1 Result类型

什么是Result 类型

Result 类型并不是Swift标准库中(在Swift5中苹果已将Result置为标准库中)的类型。简单介绍就是一个简化成功和失败两种情况的枚举。 个人感觉Result更像是一种编程思想。

书中大部分篇幅是讲try catchthrows 相关的东西 Result 类型相关讲的不多。 为了能简单高效的理解Result类型 下面会直接拿使用场景来讲Result相关的知识点。

首先我们先说说swift中可选值Optional的本质: 其实是一个枚举,它包含.Some 和.None两个枚举值

// Optional的本质
@frozen public enum Optional<Wrapped> : ExpressibleByNilLiteral {

case none

case some(Wrapped)

}

tips:项目中需要自定义枚举时,避免不要有 .none 这个case, 因为当你的枚举为可选值时,就和 Optional 中的 .none 重复了。。

Result类型结构和可选值Optional结构非常相似

Result使用场景

在通常的网络请求中,我们都是通过success和failed两个闭包来传递结果

    AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
[session GET:@"需要请求的url" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"请求成功");
} failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"请求失败");        
}];

这个时候使用result类型 就可以用一个对象去处理这两种情况

下面我们来手动实现一个自己的result类型。

1、我们先定义成功和失败的两个协议:

成功的协议,可以扩展成功的对象需要的任何东西。 LWSuccessedProtocol

失败的协议,可以扩展失败的对象需要的任何东西。 LWFailedProtocol

2、我们创建一个LWResult枚举

Result枚举有2个泛型,T继承LWSuccessedProtocol,Error继承LWFailedProtocol。枚举有2种情况,一种是成功(success),一种是失败(failure),还有对应的初始化。 我们就完成了一个Result类型的定义了。

public protocol LWSuccessedProtocol {
    
}

public protocol LWFailedProtocol {
    
}

public enum LWResult<T:LWSuccessedProtocol, Error:LWFailedProtocol> {
    case success(T)
    case failure(Error)
    
    public init(value:T) {
        self = .success(value)
    }
    
    public init(error:Error) {
        self = .failure(error)
    }
}

自定义Result的具体使用:在拿到网络请求的回调之后去处理拿到的数据 注:下面Demo中 API为API接口的伪代码, completion为result类型的闭包

    NetworkRequest(api:API, completion: LWResult) {

        if 网络请求成功 {
            let successResult = LWSuccess()
            completion(TDWResult(value: successResult))

        } else {

            let failResult = LWFailure()
            completion(TDWResult(error: failResult))

        }

    }
    
        // 方法调用和网络请求的处理
        NetworkRequest(api:XXXapi, {result in 

            switch result : 
            case: .success(let data):
                //网络请求成功的处理
            case: .failed(let error)
                // 网络请求失败的处理
        }

注:使用Moya作为项目网络请求框架同学一定对Result类型不陌生。Moya天生就是对Result类型的扩展封装。 上面的Demo可以让各位同学对Result类型有一个更好的理解。