快速函数完成
Posted
技术标签:
【中文标题】快速函数完成【英文标题】:Swift function completion 【发布时间】:2014-11-23 16:54:05 【问题描述】:我已经阅读了一些内容,并且在类似的帖子 (Swift closure with Alamofire) 中提出了建议,并尝试对我的代码执行相同的操作,但我现在找不到调用该函数的方法?
我得到一个错误:无法将表达式的类型“(响应:@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
谢谢!
科斯塔斯
【问题讨论】:
【参考方案1】:鉴于您对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
的骆驼命名约定)。
【讨论】:
顺便说一下,the answer to your other question 显示了一个带有两个参数的闭包示例。显然,鉴于您正在处理 XML,您可能也想解析它,但另一个答案说明了通过闭包传递两个参数的想法。以上是关于快速函数完成的主要内容,如果未能解决你的问题,请参考以下文章