Ios 快速功能完成

Ios 快速功能完成,ios,function,swift,alamofire,Ios,Function,Swift,Alamofire,我读了一些书,在一篇类似的帖子()中有人推荐我,并尝试对我的代码执行同样的操作,但我现在找不到调用函数的方法 我得到一个错误:无法将表达式的类型“(响应:@lvalue String)”转换为类型“((响应:String)->())->()” 功能如下: func call_api_function(completion: (response: String) -> ()) { let api_url_path: String = "http://\(str_api_server

我读了一些书,在一篇类似的帖子()中有人推荐我,并尝试对我的代码执行同样的操作,但我现在找不到调用函数的方法

我得到一个错误:无法将表达式的类型“(响应:@lvalue String)”转换为类型“((响应:String)->())->()”

功能如下:

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

    }

}
func调用api函数(完成:(响应:字符串)->()){
让api\u url\u path:String=“http://\(str\u api\u server\u ip):\(str\u api\u server\u port)”
让api\u url=NSURL(字符串:api\u url\u path+“/devices.xml”)!
请求(.GET,api_url)
.验证(用户:str\u api\u用户名,密码:str\u api\u密码)

.validate(statusCode:200..根据您对调用api函数的定义,您可以这样调用它:

call_api_function() { response in

    activityInd.stopAnimating()

    // now use `response` here
}
我建议您对中的尾部闭包进行一些研究


但是,话虽如此,您的
调用api\u函数
本身也有问题

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

  • 如果请求成功,则您没有对返回的
    数据执行任何操作。您执行请求可能是因为希望对返回的数据执行某些操作

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

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

  • 这是一个很小的问题,但您可能希望采用Cocoa命名约定(例如
    callApiFunction
    的camelCase约定)

顺便说一句,显示了一个带有两个参数的闭包示例。显然,如果您处理的是XML,您可能也想解析它,但另一个答案说明了通过闭包传递两个参数的想法。
call_api_function() { response in

    activityInd.stopAnimating()

    // now use `response` here
}