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

90

Мы можем объявить блок, как показано ниже, в 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
@Downvotters: Пожалуйста, объясните, что не так в этом вопросе?
Mani
1
Есть ряд людей, которые считают, что сначала нужно выучить быстрый язык, а затем писать. Глупые чувства ...
Джанак Нирмал
@Mani Привет, не могли бы вы также показать, как вы назначаете этот псевдоним типа var(то есть, var completion: CompletionBlock = {....}используя несколько аргументов? Спасибо.
Unheilig

Ответы:

141

Синтаксис для типов функций является (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+.

jtbandes
источник
Если для этого требуется более двух аргументов, как мы можем это сделать? Не могли бы вы дать мне ссылку на эту книгу или другую?
Mani
Лучшая книга для Swift: Apple Inc. «Язык программирования Swift». iBooks. itun.es/ca/jEUH0.l
Дэвид Скрундз
@NSArray Я знаю, что для Swift доступна только одна книга. Но я спрашиваю об этой соответствующей главе с темой ... :)
Мани
4
@jtbandes Работает. Я создал с двумя аргументами какtypealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani
@zumzum Он отделяет имя параметра " reason" от тела метода " println(reason)"
jtbandes 01
13

Вот отличный блог о быстром закрытии.

Вот некоторые примеры:

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

var closureName: (inputTypes) -> (outputType)

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

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

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

typealias closureType = (inputTypes) -> (outputType)
BLC
источник