你能帮我理解一下这个Swift方法吗?

时间:2015-07-26 17:29:48

标签: swift closures

我是第一次使用Swift并使用AlamoFire库构建应用程序。我之前使用Obj-C和AFNetworking构建了应用程序,但是我很难使用这种Swift响应方法:

Alamofire.request(.GET, "http://someapi.com/thing.json")
         .responseJSON { _, _, JSON, _ in
             println(JSON)
         }

实际的方法定义是:

public func responseJSON(options: NSJSONReadingOptions = .AllowFragments, completionHandler: (NSURLRequest, NSHTTPURLResponse?, AnyObject?, NSError?) -> Void) -> Self {
        return response(serializer: Request.JSONResponseSerializer(options: options), completionHandler: { request, response, JSON, error in
            completionHandler(request, response, JSON, error)
        })
    }

当我使用这种响应方法时,我真的不明白这里发生了什么。

为什么我在方法调用中没有使用parens?

我只是将块或匿名函数传递给此方法吗?

传递下划线(_)有什么意义?

in关键字在做什么?

1 个答案:

答案 0 :(得分:3)

一切都在这里: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID102

没有parens:那是尾随闭包语法。想法是封闭可以变长,难以记住/确定长距离对子。

是,block =匿名函数=(匿名)关闭。是的,您将其作为唯一参数传递。由于它被省略,'options'的默认值为'.AllowFragments'。尾随闭包PriorityQueue绑定到{ ... }参数。

'_'是'不关心此参数'的语法...例如如果该函数不使用该参数,则无需给它一个本地名称。

completionHandler是闭包语法的一部分:表示函数体的开始。绝对阅读上面的整个闭包语法章节。它的设计非常简洁,没有任何直观的。