2016-01-20 2 views
1

Я видел объекты, для которых требуется параметр, селектор. Какова общая концепция понимания селектора?Какова концепция селекторов в быстром?

Примером выбора селектора является NSTimer, где мой селектор, выбранный мной, является функцией, которая увеличивает счетчик.

timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: ("incrementCounter"), userInfo: nil, repeats: true) 

ответ

3

Селектор - это концепция из Objective-C, которая представляет собой сообщение, которое должно быть отправлено (то есть метод, который будет вызываться) динамически во время выполнения. Когда вы настраиваете что-то, что нужно сделать с помощью селектора, вы знаете, какое сообщение будет отправлено, но не обязательно, каковы его параметры. (И иногда даже не тот объект, на который он будет отправлен.)

Вы можете рассматривать селекторы как относительные замыкания/блоки, так как они позволяют вам упаковать код, который будет вызываться позже, и передать его другой функции , Однако закрытие должно быть указано/разрешено во время компиляции, поэтому оно менее динамично, чем селектор.

Селекторы отлично подходят для концепций «свободной привязки», таких как управляющие действия. Вы можете использовать селектор для выбора в Interface Builder, который метод должен вызывать при нажатии кнопки, даже если ваше приложение фактически не работает в IB; или вы можете сказать, что «эта кнопка должна вызывать paste: на любом текстовом представлении с фокусом клавиатуры», не зная, когда вы настраиваете кнопку, которая будет выглядеть (потому что фокус клавиатуры меняется все время).

Селекторы в блоках/закрытиях предшественников ObjC, поэтому исторически селекторы были основным способом рассказать о таких вещах API, как «вызвать этот метод позже», поэтому вы найдете их в Cocoa для таких шаблонов, как таймеры, сортировка массивов и отменить, даже если такие шаблоны могут выиграть от жесткой привязки затворов/блоков.

Для получения дополнительной информации об использовании селекторов в Swift см Interacting with Objective-C APIs в Использование Swift с какао и Objective-C и/или this SO answer. Подробнее о селекторах и какао в целом см. Cocoa Core Competencies: Selector.

2

selector является пользовательский метод, который вызывается в классе, указанной target Когда срабатывает таймер. Если метод должен принимать параметры, каждый параметр представлен двоеточием.

В Свифт structSelector отвечает на протокол StringLiteralConvertible,
Поэтому - так как компилятор знает тип в вашем примере - это символьная строка неявно преобразуется в Selector инстанции и Selector инициализатор не требуется.

PS: Скобки вокруг вашей селекторной строки также не нужны.