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(), не определенное типом?





Полное имя селектора (с именем класса) не требуется, даже в методах, не отмеченных @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)
хотя, похоже, причин для этого мало.
Основная причина полностью уточнять имя селектора именем класса — избежать проблем во время выполнения, гарантируя во время компиляции, что указанный метод действительно существует в указанном классе.