将范围传递给命名函数,而不是闭包

时间:2015-06-04 12:20:19

标签: swift

我想将我的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中执行此操作。

1 个答案:

答案 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...

    }
}