Result 类型并不是Swift标准库中(在Swift5中苹果已将Result置为标准库中)的类型。简单介绍就是一个简化成功和失败两种情况的枚举。 个人感觉Result更像是一种编程思想。
书中大部分篇幅是讲try
catch
和throws
相关的东西 Result 类型
相关讲的不多。 为了能简单高效的理解Result类型 下面会直接拿使用场景
来讲Result相关的知识点。
首先我们先说说swift中可选值Optional的本质
:
其实是一个枚举
,它包含.Some 和.None两个枚举值
。
// Optional的本质
@frozen public enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none
case some(Wrapped)
}
tips:项目中需要自定义枚举时,避免不要有 .none
这个case, 因为当你的枚举为可选值
时,就和 Optional 中的 .none 重复了。。
在通常的网络请求中,我们都是通过success和failed两个闭包来传递结果
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
[session GET:@"需要请求的url" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"请求成功");
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"请求失败");
}];
这个时候使用result类型 就可以用一个对象
去处理这两种情况
成功的协议,可以扩展成功的对象需要的任何东西。
LWSuccessedProtocol
失败的协议,可以扩展失败的对象需要的任何东西。
LWFailedProtocol
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类型有一个更好的理解。