В каком контексте мы можем использовать неквалифицированное выражение #selector() в Swift?

Swift-эквивалент выражения @selector() в Objective-C — #selector(). В Xcode выражение Objective-C @selector() будет предлагать автодополнение для всех доступных селекторов, а выражение селектора создается только с помощью селектора; например, @selector(valueForKey:).

В Swift Xcode лишь иногда предлагает автодополнение для выражения #selector(), и мы должны явно указать тип селектора; например, #selector(NSObject.value(forKey:)).

Насколько я могу судить, в контексте @objc Xcode позволит нам создать выражение #selector() без указания типа селектора.

Например:

@objc @objcMembers class Individual: NSObject {
    func testFunc() {
        let sel = #selector(value(forKey:))
    }
}

Есть ли какой-либо другой контекст, в котором мы можем использовать выражение #selector(), не определенное типом?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Полное имя селектора (с именем класса) не требуется, даже в методах, не отмеченных @objc. Конечно, сам селектор должен быть либо методом Objective-C, либо методом Swift, отмеченным @objc.

Как ни странно, ни в одной документации не приведен пример #selector без полного имени, но я никогда не использую полное имя, и оно работает нормально. Это работает так же, как в Objective-C. Пока компилятор может найти такой метод в любом известном классе проекта, неквалифицированный селектор можно использовать в любом контексте.

Соответствующая документация (без неквалифицированных примеров):

Кстати, Xcode не требует для меня полного имени. Если я напишу что-то вроде:

let sel = #selector(

а затем введите букву, например v, Xcode предлагает множество селекторов, которые начинаются с v, но не включают имя класса.

Также обратите внимание, что имя селектора не требует скобок и аргументов, за исключением случаев, когда вам необходимо устранить неоднозначность между именами перегруженных методов.

В качестве примера предположим, что у нас есть обработчик кнопки в каком-то коде iOS. Нам нужен селектор для вызова addTarget. Метод-обработчик может выглядеть так:

@objc func buttonTapped(_ button: UIButton) {
}

Ниже приведены все допустимые варианты использования #selector:

#selector(SomeClass.buttonTapped(_:))
#selector(SomeClass.buttonTapped)
#selector(buttonTapped(_:))
#selector(buttonTapped)

А если селектор, на который ссылаются, принадлежит к тому же классу, что и строка #selector, вы также можете добавить к имени селектора префикс Self.:

#selector(Self.buttonTapped(_:))
#selector(Self.buttonTapped)

хотя, похоже, причин для этого мало.

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

Другие вопросы по теме