函数声明中的 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 错误闭包的主要内容,如果未能解决你的问题,请参考以下文章

php 闭包:为啥绑定到静态类时匿名函数声明中的“静态”?

无法在目标 C 中调用 swift 函数。获取 NSObject 的错误接口声明

闭包实例&解释

Swift 中的可选闭包属性

iOS开发-Swift进阶之闭包,逃逸闭包 & 非逃逸闭包!

js-闭包