第八章:错误处理
8.1 Result类型 Result Type
什么是Result 类型
Result 类型并不是Swift标准库中的类型。就是一个简化成功和失败两种情况的枚举。 个人感觉更像是一种编程思想。
书中大部分篇幅是讲try
catch
和throws
相关的东西 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类型有一个更好的理解。