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) -> ()
Ответы
Ответ 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)