函数声明中的 Swift 错误闭包
Posted
技术标签:
【中文标题】函数声明中的 Swift 错误闭包【英文标题】:Swift incorrect closure in function declaration 【发布时间】:2018-12-18 06:28:59 【问题描述】:我正在尝试在我的项目中使用Moya Networking。我正在使用这个example。该示例在第 56 行的视图控制器中发出 moya 请求以连接到服务器,并在第 72 行和第 78 行中使用回调方法
func uploadGiphy()
provider.request(MultiTarget(Giphy.upload(gif: Giphy.animatedBirdData)),
callbackQueue: DispatchQueue.main,
progress: progressClosure,
completion: progressCompletionClosure)
我想在 NetworkHelper.swift 中而不是我的视图控制器中编写这个函数,但是在我的视图控制器中使用它的两个回调方法(第 72 行和第 78 行)。
所以我在NetworkHelper中写了这个函数:
static func getUsers(amount:Int=2,
gender:Gender = .Male,
success successCallback: @escaping ([UserModelMain]) -> Void,
error errorCallback: @escaping (Swift.Error) -> Void,
failure failureCallback: @escaping (Moya.MoyaError) -> Void,
progress progressClosure: @escaping (Moya.ProgressResponse) -> Void,
progressCompletion progressCompletionClosure: @escaping (Moya.Completion) -> Void)
provider.request(.getUsers(amount: amount, gender: gender),
callbackQueue: DispatchQueue.main,
progress: progressClosure,
completion: progressCompletionClosure)
显示错误:
无法转换类型 '((Result) -> Void) 的值 -> Void' 到预期的参数类型'Completion'(又名'(Result) -> ()')
我认为我的函数 getUsers 写错了。我搞砸了。我不擅长闭包。
请帮忙。
Moya网络库请求函数源码:
/// Designated request-making method.
Returns a `Cancellable` token to cancel the request later.
@discardableResult
open func request(_ target: Target,
callbackQueue: DispatchQueue? = .none,
progress: ProgressBlock? = .none,
completion: @escaping Completion) -> Cancellable
let callbackQueue = callbackQueue ?? self.callbackQueue
return requestNormal(target, callbackQueue: callbackQueue, progress: progress, completion: completion)
【问题讨论】:
【参考方案1】:Moya.Completion
已经是一个完成块。您只需将Moya.Completion
作为参数传递,而不是(Moya.Completion) -> Void
。
progressCompletion progressCompletionClosure: @escaping Moya.Completion)
您当前的代码,就像错误提示一样,正在发送((Result) -> Void) -> Void
【讨论】:
如何使它成为可选的? 另外,我的进度progressClosure:@escaping (Moya.ProgressResponse) 总是抛出0.0 SheikhAtif,删除 @escaping 关键字并添加“?”使其成为可选(可选闭包是默认转义,不需要使用@escaping)。如下所示:progressCompletion progressCompletionClosure: Moya.Completion?)以上是关于函数声明中的 Swift 错误闭包的主要内容,如果未能解决你的问题,请参考以下文章
无法在目标 C 中调用 swift 函数。获取 NSObject 的错误接口声明