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


Если для этого требуется более двух аргументов, как мы можем это сделать? Не могли бы вы дать мне ссылку на эту книгу или другую?
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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.