swift: Декларація про закриття як подібна до блоку


90

Ми можемо оголосити блок, як показано нижче в Objective-C.

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

Я намагаюся зробити це швидко, це видає помилку.

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

Помилка: Використання незадекларованого 'completeFunction'

Визначення:

var completion: CompletionBlock = { }

Як це зробити?

Оновлення:

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

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

1
@Downvotters: Поясніть, будь ласка, що не так із цим запитанням?
Мані

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


Якщо потрібно більше двох аргументів, як ми можемо це зробити? Чи не могли б ви, будь ласка, направити мене на посилання в цій книзі чи будь-якому іншому?
Мані

Найкраща книга для Swift: Apple Inc. “Мова програмування Swift”. iBooks. itun.es/ca/jEUH0.l
Давид Скрундц

@NSArray Я знаю, що швидко доступна лише одна книга. Але я запитую про відповідний розділ з темою ... :)
Мані

4
@jtbandes Це працює. Я створив з двома аргументами, якtypealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Мані

@zumzum Він відокремлює ім'я параметра " reason" від тіла методу " println(reason)"
jtbandes

13

Ось чудовий блог про швидке закриття.

Ось кілька прикладів:

Як змінна:

var closureName: (inputTypes) -> (outputType)

Як необов’язкова змінна:

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

Як псевдонім типу:

typealias closureType = (inputTypes) -> (outputType)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.