swift - 在swift中允许@escaping中的多个可选参数
问题描述
我有这个方法:
func getdata(someString: String, onComplete: @escaping ((_ someArrayData: [String], _ error: Error?) -> Void)) {
var result: [BanPhone] = []
// Some Actions
if(someaction is successful)
{
onComplete(result)
}
else {
onComplete(result, Error)
}
}
错误是可选的,我只想在收到错误时传递此参数。否则我想发回结果。我怎么能在这里做到这一点
解决方案
在回答您的问题时,您在成功时使用结果调用它,并传递nil
错误参数,例如在成功场景中:
onComplete(result, nil)
如果有一些错误,你会调用它提供错误代码,但没有价值:
onComplete(nil, error)
现在,我们通常会使用Result
类型。有关实际讨论,请参见https://www.swiftbysundell.com/basics/result/。
我们赞成Result
“两个可选参数”模式,因为它明确地向调用者表明,要么成功返回一个值,要么失败返回一个错误,一个或另一个,但不是两者兼而有之。
func fetchData(with someString: String, completion: @escaping (Result<[String], Error>) -> Void)) {
...
doingSomethingAsynchronous {
...
// if failed
if let error = error {
completion(.failure(error))
return
}
// if successful
completion(.success(value))
}
}
并像这样使用它:
fetchData(with: string) { result in
switch result {
case .failure(let error):
print(error)
case .success(let value):
// do something with `value`
}
}
现在,这就是两个可选参数模式在实践中趋于工作的方式(它是一个或另一个),但是Result
使合同形式化,使您免于解包选项等。
推荐阅读
- azure - 将 Azure 文件共享中的单个文件装载到容器中
- django - POST是在django中发送数据的唯一方法吗?
- javascript - 创建自定义验证装饰器:它是如何工作的?
- java - Spring-boot - 从用户那里获取 base64,然后点击另一个接受 Multipart/Form-Data 的 API
- ios - 错误:产生多个命令,IOS 在 Mac Mini M1 中构建错误颤动
- azure - 为订阅上的 Azure AD 组创建具有某些所有者权限的自定义角色
- kubernetes - 当配置不指向 localhost 时,与服务器 localhost:8080 的连接被拒绝
- java - 无论我做什么,状态栏通知图标都保持黑色
- c# - Restsharp RequestBody 挑战,JSON 格式问题?
- r - VSCode R packrat 库位置