Код некорректен: у UIView нет addTarget, #selector не принимает вызов foo: 1, а инициализатор подкласса должен корректно вызвать super.
Является ли данная запись корректной в Swift
Код некорректен: у UIView нет addTarget, #selector не принимает вызов foo: 1, а инициализатор подкласса должен корректно вызвать super.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В примере ниже создаётся подкласс UIView. В конструкторе вызывается метод addTarget с передачей текущего объекта и селектора, где в качестве аргумента указано число 1. Нужно определить, компилируется ли такой код и соответствует ли он правилам использования #selector в Swift.
class View: UIView {
init() {
self.addTarget(for: self, #selector(foo: 1))
}
}
Ответ
Код некорректен: у UIView нет addTarget, #selector не принимает вызов foo: 1, а инициализатор подкласса должен корректно вызвать super.
Для target-action используйте UIControl/UIButton:
button.addTarget(self, action: #selector(foo(_:)), for: .touchUpInside)
@objc private func foo(_ sender: UIButton) {
// Использовать sender или состояние контроллера.
}
Эти строки размещаются соответственно в методе настройки и теле класса. Для UIView добавьте UITapGestureRecognizer. В собственном подклассе требуется корректный init(frame:) с вызовом super и реализация required init?(coder:). Число 1 не кодируется в селекторе: селектор указывает метод, аргумент события передаёт вызывающий механизм.