2015-01-20 2 views
1

Я пришел через этот код:Как понять этот тестовый код быстрого кода GCDWebServer?

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) -> ...)

EDIT: Уточнить, что я не понимаю,

Согласно документации по 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 так быстро?

ответ

1

В Swift вы можете использовать этот синтаксис, если последним аргументом функции является закрытие. Вот пример из Swift language guide section about closures (прокрутите вниз до 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!") 
} 
1

Закрытие, где выполняется обработка входящего запроса . Он сообщает серверу о запуске кода закрытия, когда приходит метод GET, который запрашивает путь /hello.

В коде, который вы опубликовали в закрытии, создается ответ, возвращаемый сервером.

+0

Спасибо большое, и я ценю ваш ответ! Однако я думаю, что мой вопрос больше связан с этой конкретной формой синтаксиса, а не с тем, что делает код. Я обновил свой вопрос, чтобы уточнить, чего я не понимаю. –

Смежные вопросы