2014-11-23 62 views
1

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

我得到的错误:无法转换表达式的类型“(回应:@lvalue字符串)为键入 '((回应:字符串) - >()) - >()'

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 

    } 

} 

谢谢!

科斯塔斯·

回答

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约定)。

+0

非常感谢您的输入Rob!非常感激!!!! – Kostas 2014-11-23 17:44:30

+0

顺便说一句,[您的其他问题的答案](http://stackoverflow.com/a/27089820/1271826)显示了一个具有两个参数的闭包示例。很明显,考虑到你正在处理XML,你可能也想解析它,但是另一个答案说明了通过闭包传递两个参数的想法。 – Rob 2014-11-23 23:06:11