我想将我的NSURLSession的数据处理分成一个单独的方法。
在发出网址请求时,我依靠封闭范围向我提供用户callback
。
这有效:
static func makeRequest(url: String, callback: APICallback) {
let urlObject = NSURL(string: url)
var request = createRequest(urlObject!, method: "GET") // internal
var session = NSURLSession.sharedSession()
var task = session.dataTaskWithRequest(request){
(data, response, error) -> Void in
// do some basic parsing, error checking, then...
callback(data, nil)
}
task.resume()
}
我想在应用程序级别做很多基本的解析和错误检查,所以我想定义并传递一个函数而不是一个闭包到{{1方法:
dataTaskWithRequest
这一切都引出了我的问题,尽管有冗长的例子,但这个问题与语言特征有关。我可以将一些捕获的范围传递给此方法吗?在Javascript中,我可以使用Function.prototype.bind完成此操作,但我不确定如何在Swift中执行此操作。
答案 0 :(得分:2)
这似乎是何时使用curried方法的一个很好的例子。使用APICallback
的第一个参数声明这样的函数。注意括号。
static private func gotResponse(callback: APICallback)(nsdata: NSData!, response: NSURLResponse!, err: NSError!) -> Void {
// use callback: like normal
}
然后,像这样使用它:
var task = session.dataTaskWithRequest(request, completionHandler: gotResponse(callback))
(道歉,语法可能不是100%正确,因为你的代码不是独立的,所以我无法完全测试它)
Curried函数有点挑剔并且在1.1中有一些错误(尽管它们在1.2中得到了修复),所以不使用它们的语言支持,如果以上方法不起作用,你可以尝试手动滚动,类似于:
static private func gotResponse(callback: APICallback) -> (nsdata: NSData!, response: NSURLResponse!, err: NSError!) -> Void {
return { data, response, error in
// put the common code, capturing callback:, in here...
}
}