首页 > 解决方案 > Swift 可选的完成处理程序

问题描述

我正在尝试在我的 Swift 应用程序中创建一个服务对象,以便更轻松地处理请求。我已经完成了大部分工作,但是我可能误解了完成处理程序。

我有这个函数,它只是发布到我正在运行的本地 API 端点。

func createList(name: String, completion: @escaping (Response) -> Void) {
        let parameters = ["name": name, "user_id": session.auth.currentUser!.uid]
        
        AF.request("\(url)/wishlist", method: .post, parameters: parameters, encoding: URLEncoding.default).responseDecodable(of: Response.self) { response in
                switch response.result {
                case .failure(let err):
                    print(err)
                case .success(let res):
                    completion(res)
            }
        }
    }

需要发生的只是我需要将该名称传递给我在这里执行的函数

barback.createList(name: name) -> after a button is tapped

但是,我现在收到此错误。

调用中缺少参数“完成”的参数

我的目标是只返回Response对象,以便我可以访问其属性以在 UI 中执行某些操作。我无法返回res这里,因为据我了解,这是一个异步请求,它实际上是从那个竞争处理程序返回的?(可能是屠杀)。我看到其他人这样做的方式是在参数中添加一个竞争处理程序并为其添加一个转义。

我的最终目标是做类似...

if barback.createList(name: name).status = 200
    (trigger some UI component)
else
    (display error toast)
end

我的功能在设计上有缺陷吗?我尝试将我的比赛处理程序更改为

完成:(@escaping(响应)-> Void)= nil

但在那里遇到了一些其他错误。这里有什么指导吗?

标签: iosswift

解决方案


调用createList看起来更像这样:

barback.createList(name: name) { response in
    if response.status == 200 {
        // OK
    } else {
        // Error
    }
}

这解决了这个问题,因为你现在正在运行这个completion闭包——你传入的值{ response in ... }在哪里response。在这种情况下,你传入res. 请参阅这篇关于使用完成处理程序的帖子。


如果您确实需要一个可选的完成处理程序,因此您并不总是需要包含它,您可以将定义更改为以下内容(添加 = { _ in },意味着它默认为空闭包):

func createList(name: String, completion: @escaping (Response) -> Void = { _ in })

另一种方法实际上是使闭包可选:

func createList(name: String, completion: ((Response) -> Void)? = nil)

然后在?调用时需要的方法completion中,因为它是可选的:

completion?(res)

推荐阅读