Swift:如何调用其中一个参数是完成处理程序的函数

Posted

技术标签:

【中文标题】Swift:如何调用其中一个参数是完成处理程序的函数【英文标题】:Swift: How to call functions where one of the arguments is a completionHandler 【发布时间】:2015-09-03 18:55:13 【问题描述】:

我对 XCode 和 Swift 很陌生,在我的 ios 应用程序中,我编写了一个方法来执行对服务器上 php 文件的 POST 请求,方法是遵循 *** 中的一些答案 here:

func closeTaskService(id_task:Int, completionHandler: (response: NSString) -> ()) 

    let request = NSMutableURLRequest(URL: NSURL(string: Settings.webServerGetUserTasks)!)
    request.HTTPMethod = "POST"
    let postParams = "action=close&id_task=\(id_task)"
    request.HTTPBody = postParams.dataUsingEncoding(NSUTF8StringEncoding)

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
        data, response, error in

        println("response = \(response)")
        let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("responseString = \(responseString!)")

        completionHandler(response: responseString!)

    
    task.resume()

在哪里

webServerGetUserTasks = "http://localhost:8888/excogitoweb/mobile/handleTasks.php"

问题是我不知道如何在我的视图控制器类上调用该函数。我见过的例子在函数中没有参数,所以当它被调用时,他们只是写了闭包。这是我到目前为止尝试过的:

self.taskService.closeTaskService(self.taskCollection[indexPath.row].id), (response: NSString) -> () in
        println("response = \(response)"))

但是 XCode 显示很多错误,它建议我添加 ';'在两三个地方...请您解释一下如何调用这种函数以及如何编写闭包?

【问题讨论】:

【参考方案1】:

我猜是一个简单的拼写错误。当我使用完成处理程序调用函数时,我总是让自动完成来完成它的工作,然后双击周围有一个圆角框的东西。这总是给出正确的语法。

self.taskService.closeTaskService(self.taskCollection[indexPath.row].id)  (response) -> () in
    print(response)

【讨论】:

也谢谢你。毕竟这很简单......它有效:)【参考方案2】:

试试这个

func closeTaskService(id_task:Int, completionHandler: (response: NSString) -> ()) 
    let request = NSMutableURLRequest(URL: NSURL(string: "http://myserverip/myfile.php")!)
    request.HTTPMethod = "POST"
    let postParams = "action=close&id_task=\(id_task)"
    request.HTTPBody = postParams.dataUsingEncoding(NSUTF8StringEncoding)
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
        data, response, error in
        println("response = \(response)")
        let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("responseString = \(responseString!)")
        completionHandler(response: responseString!)
    
    task.resume()

然后像这样调用你的方法

self.closeTaskService(12, completionHandler:  (response) -> () in
    //handle response
)

【讨论】:

【参考方案3】:

试试这个

self.taskService.closeTaskService(self.taskCollection[indexPath.row].id), completionHandler: (response: NSString) -> () in
            println("response = \(response)")
)

【讨论】:

【参考方案4】:

首先要了解闭包表达式语法是如何定义的,根据Apple闭包表达式语法有如下一般形式:

 (parameters) -> return type in
    statements

根据Apple:

如果您需要将闭包表达式作为函数的最终参数传递给函数并且闭包表达式很长,则将其写为 trailing closure 会很有用。尾随闭包是写在它支持的函数调用的括号之外(和之后)的闭包表达式:

func someFunctionThatTakesAClosure(closure: () -> Void) 
    // function body goes here


// here's how you call this function without using a trailing closure:

someFunctionThatTakesAClosure(
    // closure's body goes here
)

// here's how you call this function with a trailing closure instead:

someFunctionThatTakesAClosure() 
    // trailing closure's body goes here

然后,我认为通过上面的答案和这个答案,您可以更好地理解闭包的工作原理以及如何调用它。不过,我强烈建议您阅读 Apple 书籍的 Closures 章节,以深入了解它的工作原理。

希望对你有所帮助。

【讨论】:

谢谢,肯定有帮助。现在它更清楚了......问题是我正在开发我的第一个 iOS 应用程序,而我还在学习 Swift 和 iOS 等等......我迷失在这些小事情中......

以上是关于Swift:如何调用其中一个参数是完成处理程序的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 API 调用中设置完成处理程序 - Swift 5

如何存储闭包完成处理程序以供以后调用?

如何在 swift 中包含多个功能的完成处理程序?

如何使用 swift 和 firebase 正确使用完成处理程序?

Swift 异步方法和返回/完成块

在 Swift 中向用户显示网络错误消息