繁体   English   中英

如何理解此GCDWebServer Swift单元测试代码?

[英]How to understand this GCDWebServer swift unit test code?

我遇到了这段代码:

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这种方式?

关闭是处理传入请求的地方。 当请求/hello路径的GET方法到来时,它告诉服务器运行闭包的代码。

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

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

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!")
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM