如何理解这个GCDWebServer swift单元测试代码



我遇到了这段代码:

class WebServerTests: XCTestCase {
    let webServer: GCDWebServer = GCDWebServer()
    var webServerBase: String!
    /// Setup a basic web server that binds to a random port and that has one default handler on /hello
    private func setupWebServer() {
        webServer.addHandlerForMethod("GET", path: "/hello", requestClass: GCDWebServerRequest.self) { (request) -> GCDWebServerResponse! in
            return GCDWebServerDataResponse(HTML: "<html><body><p>Hello World</p></body></html>")
        }

我对webServer.addHandlerForMethod部分感到困惑。在我看来,这已经是一个完整的函数调用(webServer.addHandlerForMethod("GET", path: "/hello", requestClass: GCDWebServerRequest.self))。因此我不明白为什么它后面跟着一个闭包({(request) -> ...

编辑:澄清我不明白的内容

根据 https://github.com/swisspol/GCDWebServer 的文档,obj-c 中的函数签名是:

[webServer addDefaultHandlerForMethod:@"GET"
                         requestClass:[GCDWebServerRequest class]
                    asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) {

因此,我希望它的快速对应物会像这样称呼:

        webServer.addHandlerForMethod("GET", path: "/hello", requestClass: GCDWebServerRequest.self, { (request) -> GCDWebServerResponse! in
            return GCDWebServerDataResponse(HTML: "<html><body><p>Hello World</p></body></html>")
        })

即传入请求的处理作为第三个参数传递。但是由于闭包是在闭包 ')' 之后出现的,所以它看起来根本不像函数调用的一部分。

为什么函数签名以这种方式从 obj-c 映射到 swift?

在 Swift 中,如果函数的最后一个参数是闭包,则可以使用此语法。以下是 Swift 语言指南部分中有关闭包的示例(向下滚动到尾随闭包):

func someFunctionThatTakesAClosure(closure: () -> ()) {
    // function body goes here
}
// here's how you call this function without using a trailing closure:
someFunctionThatTakesAClosure({
    // closure's body goes here
})
// here's how you call this function with a trailing closure instead:
someFunctionThatTakesAClosure() {
    // trailing closure's body goes here
}

然后还有这个注释:

如果将闭包表达式

作为函数的唯一参数提供,并且您提供该表达式作为尾随闭包,则在调用函数时无需在函数名称后写入一对括号 ()。

这意味着写这个也是合法的:

someFunctionThatTakesAClosure {
    // closure body
}

。这有助于提供一个很好的元编程语法。例如:

let lock = NSLock()
func locked(closure: () -> ()) {
    lock.lock();
    closure()
    lock.unlock();
}
locked {
    NSLog("Hello, world!")
}

闭包是处理传入请求的地方。它告诉服务器在请求路径/hello GET方法出现时运行闭包的代码。

在您发布的代码中,闭包中的代码创建服务器返回的响应。

相关内容

  • 没有找到相关文章

最新更新