这个成功方法是什么? (Swift 关闭)

What is this success method? (Swift Closure)

所以我从 Ray Wenderlich 的 Swifty JSON 教程中复制粘贴了一些代码,但无法理解我所做的一些调用。

我浏览了 SwiftyJSON 库,查看了开发者网站上的 NSURL 描述,并查看了 Swift 指南,但我要么不能'找不到它,否则我会得到一堆杂货。

这些成功调用是什么意思?

    func getIndexWithSuccess(success: ((indexData: NSData!) -> Void)) {
        loadDataFromURL(NSURL(string: url)!, completion:{(data, error) -> Void in
            if let urlData = data {
                /* HERE */
                success(indexData: urlData)
            }
        })
    }

    func loadDataFromURL(url: NSURL, completion:(data: NSData?, error: NSError?) -> Void) {
        var session = NSURLSession.sharedSession()

        let loadDataTask = session.dataTaskWithURL(url, completionHandler: { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
            if let responseError = error {
                completion(data: nil, error: responseError)
            } else if let httpResponse = response as? NSHTTPURLResponse {
                if httpResponse.statusCode != 200 {
                    var statusError = NSError(domain:"com.raywenderlich",
                        code:httpResponse.statusCode,
                        userInfo:[NSLocalizedDescriptionKey : "HTTP status code has unexpected value."])
                    completion(data: nil, error: statusError)
                } else {
                    completion(data: data, error: nil)
                }
            }
        })
        loadDataTask.resume()
    }
}

注意上面写着:

func getIndexWithSuccess(success: ((indexData: NSData!) -> Void)) {

也就是说成功是一个参数。冒号后面的是闭包。

success,因此是一个闭包。

现在,我们应该如何解释闭包?

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

请注意,为清楚起见,上述闭包包含一些额外的括号。

您可以通过删除它们来缩短以上内容:

func getIndexWithSuccess(success: (indexData: NSData!) -> Void) {

更有帮助的链接:

http://fuckingclosuresyntax.com

http://fuckingswiftblocksyntax.com

编辑:

也许在这种情况下最清楚的解释是像这样重新排列它:

func getIndexWithSuccess(
    success: (
        data: [DoctorModel]
    )->(
        Void
    ),
    moreInfo: String = "This is another parameter, but the trailing closure technique wont work"
) {

以上符合。但是 moreInfo 参数也是如此。尾随闭包将不起作用。通过重新排列参数使闭包位于最后,您可以使用尾随闭包技术。