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

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

作者: liaoworkinn | 来源:发表于2019-03-10 16:47 被阅读0次

    第八章:错误处理

    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类型有一个更好的理解。

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

    相关文章

      网友评论

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

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