Swift功能完成

时间:2014-11-23 16:54:05

标签: ios function swift alamofire

我已经完成了一些阅读并且在类似的帖子中有推荐(Swift closure with Alamofire)并试图对我的代码做同样的事情,但我现在找不到调用该函数的方法?

我收到错误:无法将表达式的类型'(response:@lvalue String)'转换为'((response:String) - >()) - > ()'

import UIKit

class myClass101: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    var api_error: String = ""

    activityInd.startAnimating()

    call_api_function(response: api_error)

    activityInd.stopAnimating()

    if (api_error != "") {
        let alertController = UIAlertController(title: "Server Alert", message: "Could not connect to API!", preferredStyle: UIAlertControllerStyle.Alert)
        alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default,handler: nil))
        self.presentViewController(alertController, animated: true, completion: nil)
    }
  }
}

功能如下:

func call_api_function(completion: (response: String) -> ()) {

    let api_url_path: String = "http://\(str_api_server_ip):\(str_api_server_port)"
    let api_url = NSURL(string: api_url_path + "/devices.xml")!

    Alamofire.request(.GET, api_url)
        .authenticate(user: str_api_username, password: str_api_password)
        .validate(statusCode: 200..<300)
        .response { (request, response, data, error) in

            var senderror: String = error!.localizedDescription
            completion(response: senderror )

            if (error != nil) {

                println(senderror)
            }

            // do other tasks here

    }

}

谢谢!

科斯塔斯

1 个答案:

答案 0 :(得分:2)

根据您对call_api_function的定义,您可以这样称呼它:

call_api_function() { response in

    activityInd.stopAnimating()

    // now use `response` here
}

我建议你对The Swift Programming Language: Closures中的尾随闭包进行一些研究。


但是,话说回来,你的call_api_function有自己的问题。

  • 您正在强制展开error可选项。如果没有错误怎么办?然后,nil可选的强制解包将失败,代码将崩溃。

  • 如果请求成功,则表示您没有对返回的data执行任何操作。大概是你做了请求,因为你想对返回的数据做些什么。

    不幸的是,您没有提供有关您期望的XML响应的性质的信息,但可能您会实例化一个NSXMLParser实例来解析它,然后实现NSXMLParserDelegate方法并调用parse方法。

  • 继续前面的几点,而不是一个带有单个非可选参数的闭包,我希望看到一个带有两个可选参数的闭包,一个带有解析数据的可选参数(如果是请求和解析是成功的)和一个NSError的可选项(只有在出现错误时才会设置)。

  • 非常小的一点,但您可能希望采用Cocoa命名约定(例如callApiFunction的camelCase约定。)