Функция с необязательным блоком завершения в Swift

Когда я создаю функцию, я могу сделать параметр необязательным, присвоив ему значение по умолчанию, например:

func foo(bar: String = "foobar") {}

Я хочу сделать то же самое (сделать это необязательным) с блоком завершения. Я пробовал следующее:

func foo(completionBlock: (foo: String) -> () = () -> ())
func foo(completionBlock: (foo: String) -> () = (foo: String) -> ())
func foo(completionBlock: (foo: String) -> () = ((foo: String) -> ()))
func foo(completionBlock: (foo: String) -> () = ((foo: String) in))
func foo(completionBlock: (foo: String) -> () = {(foo: String) in})

Как я могу это сделать?

EDIT:
Это дублирующий вопрос, извините за это. Однако я не смог найти решение в исходном вопросе. Так что ответ Натана - лучший


person ntoonio    schedule 20.09.2016    source источник


Ответы (2)


В Свифт 3:

func foo(completionBlock: (String) -> () = { _ in }) {}
person nathangitter    schedule 20.09.2016
comment
Разве для этого не потребуется @escaping для завершенияBlock, поскольку он неявно не экранируется, начиная с Swift3.0? - person Martin; 21.02.2017

Если вы хотите по умолчанию использовать nil:

func foo(completionBlock: ((String) -> ())? = nil) {

}

Если ваш блок завершения по умолчанию очень прост, вы можете поместить его прямо в определение функции:

// A default completion block that is simple enough to fit on one line
func foo(completionBlock: (String) -> () = { result in print(result) }) {
    // ...
}

// A default completion block that does nothing
func foo(completionBlock: (String) -> () = {} ) {
    // ...
}

Если ваш блок завершения по умолчанию более сложный, вы можете определить его как отдельную функцию:

func defaultCompletion(result: String) {
    // ...
}

func foo(completionBlock: ((String) -> ()) = defaultCompletion) {

}
person Code Different    schedule 20.09.2016
comment
Где я должен разместить ключевое слово @escaping в этом случае? - person Nagendra Rao; 14.05.2018
comment
@ Рао Тебе не нужно. Необязательные закрытия @escaping по умолчанию. Подробнее об этом читайте здесь. - person Balázs Vincze; 29.09.2018