[swift 进阶]读书笔记-第八章:错误处理 C8P1 re

2019-03-10  本文已影响0人  liaoworkinn

第八章:错误处理

8.1 Result类型 Result Type

什么是Result 类型

Result 类型并不是Swift标准库中的类型。就是一个简化成功和失败两种情况的枚举。 个人感觉更像是一种编程思想。

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

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

///Optional的本质
enum Optional<T> : Reflectable, NilLiteralConvertible {

case None

case Some(T)

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

使用场景

在通常的网络请求中,我们都是通过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中completion为result类型的闭包

    if 网络请求成功 {
        let successResult = LWSuccess()
        completion(TDWResult(value: successResult))
        
    } else {
        
        let failResult = LWFailure()
        completion(TDWResult(error: failResult))
        
    }

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

文章源文件地址,大家如果有更好的想法和观点欢迎交流

上一篇下一篇

猜你喜欢

热点阅读