Подтвердить что ты не робот

Swift: объявление закрытия как объявление блока

Мы можем объявить блок, как показано ниже, в Objective-C.

typedef void (^CompletionBlock) (NSString* completionReason);

Я пытаюсь сделать это быстро, он дает ошибку.

func completionFunction(NSString* completionReason){ }
typealias CompletionBlock = completionFunction

Ошибка: использование необъявленной "функции завершения"

Определение:

var completion: CompletionBlock = { }

Как это сделать?

Обновление:

В ответ на @jtbandes я могу создать закрытие с несколькими аргументами как

typealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
4b9b3361

Ответ 1

Синтаксис для типов функций: (in) → out.

typealias CompletionBlock = (NSString?) -> Void
// or
typealias CompletionBlock = (result: NSData?, error: NSError?) -> Void
var completion: CompletionBlock = { reason in print(reason) }
var completion: CompletionBlock = { result, error in print(error) }

Обратите внимание, что круглые скобки вокруг типа ввода требуются только для Swift 3+.

Ответ 2

Здесь - это потрясающий блог о быстром закрытии.

Вот несколько примеров:

В качестве переменной:

var closureName: (inputTypes) -> (outputType)

В качестве необязательной переменной:

var closureName: ((inputTypes) -> (outputType))?

В качестве псевдонима типа:

typealias closureType = (inputTypes) -> (outputType)