1

我已经阅读了一些内容,并且在类似的帖子(使用 Alamofire 的 Swift 闭包)中提出了建议,并尝试对我的代码执行相同的操作,但我现在找不到调用该函数的方法?

我收到以下错误:无法将表达式的类型“(响应:@lvalue 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

    }

}

谢谢!

科斯塔斯

4

1 回答 1

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方法。

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

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

于 2014-11-23T17:30:41.070 回答