Swift中Result类型的强大功能

栏目: Swift · 发布时间: 6年前

内容简介:Swift类型系统的一大好处是它可以让我们在处理各种操作的结果时消除很多歧义。通过泛型和枚举值等功能,我们可以轻松创建类型,让我们利用编译器来确保我们以正确的方式处理结果。这种类型的一个例子是Result类型 - 虽然它(尚未)构建到标准库中,但它是一种在许多不同的Swift项目中很常见的类型。我们将探讨这种结果类型,以及它与Swift的一些语言功能结合使用时可以做的一些很酷的事情。网络请求是我们经常用到的场景,而网络请求一般会有2种结果:

Swift类型系统的一大好处是它可以让我们在处理各种操作的结果时消除很多歧义。通过泛型和枚举值等功能,我们可以轻松创建类型,让我们利用编译器来确保我们以正确的方式处理结果。

这种类型的一个例子是Result类型 - 虽然它(尚未)构建到标准库中,但它是一种在许多不同的Swift项目中很常见的类型。我们将探讨这种结果类型,以及它与Swift的一些语言功能结合使用时可以做的一些很酷的事情。

网络请求是我们经常用到的场景,而网络请求一般会有2种结果:

  1. 成功
  2. 失败 让我们来看看afnetworking框架是怎么去处理他们的结果的:
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
[session GET:@"需要请求的url" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"请求成功");
} failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"请求失败");        
}];
复制代码

显然,他通过2个block来处理成功与失败的回调,但是,我们能不能用一个对象去处理完这种事情呢??? ***Result***类型可以帮到你.....:stuck_out_tongue_closed_eyes::stuck_out_tongue_closed_eyes::stuck_out_tongue_closed_eyes::stuck_out_tongue_closed_eyes:

####让我们来看看什么是***Result***类型:

public protocol TDWSuccessedProtocol {
    
}

public protocol TDWFailedProtocol {
    
}

public enum TDWResult<T:TDWSuccessedProtocol, Error:TDWFailedProtocol> {
    case success(T)
    case failure(Error)
    
    public init(value:T) {
        self = .success(value)
    }
    
    public init(error:Error) {
        self = .failure(error)
    }
    
}
复制代码

以上就是一个很基础的***Result***的类型。

1、我们先定义2个协议:

  • TDWSuccessedProtocol 成功的协议,可以扩展成功的对象需要的任何东西。
  • TDWFailedProtocol 失败的协议,可以扩展失败的对象需要的任何东西。

2、我们创建一个TDWResult枚举 枚举有2个泛型, T***继承***TDWSuccessedProtocol Error***继承***TDWFailedProtocol 。枚举有2种情况,一种是成功( success ),一种是失败( failure ),还有对应的初始化。 这样,我们就完成了一个***Result***类型的定义了。

####如何使用呢? 以一个网络请求为例子:

struct TDWSuccess:TDWSuccessedProtocol {
    
}

struct TDWFailure:TDWFailedProtocol {
    
}

typealias Completion = (_ result:TDWResult<TDWSuccess,TDWFailure>)->Void

class TDWNetworkTest {
    
    class func tdw_request(parameters:String,completion:@escaping Completion) {
        
        //network request
        
        if parameters.count > 0 {
            let successResult = TDWSuccess()
            completion(TDWResult(value: successResult))
            
        } else {
            
            let failResult = TDWFailure()
            completion(TDWResult(error: failResult))
            
        }
        
        
    }
    
}
复制代码

调用 :

TDWNetworkTest.tdw_request(parameters: "abc") {(result) in
            
            switch result {
                
            case .success(let response):
                print(response)
                
            case .failure(let response):
                print(response)
            }
            
        }
复制代码

这样做的话,我们要扩展就比较简单了,不用再多定义个block,多定义元组,我们直接在***TDWResult***里面多定义一种case就可以了,扩展性就大大增强了。:stuck_out_tongue_closed_eyes::stuck_out_tongue_closed_eyes::stuck_out_tongue_closed_eyes:

如果觉得小弟说得不对,欢迎指正_________谢谢!!!!


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python for Data Analysis

Python for Data Analysis

Wes McKinney / O'Reilly Media / 2012-11-1 / USD 39.99

Finding great data analysts is difficult. Despite the explosive growth of data in industries ranging from manufacturing and retail to high technology, finance, and healthcare, learning and accessing d......一起来看看 《Python for Data Analysis》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试