Добавление цели к чему-то вроде UIGestureRecognizer
или UIButton
передает только один параметр выбранной функции.Этот параметр зависит от типа, к которому вы собираетесь добавить цель.
В вашем случае первый фрагмент кода работает, потому что вы добавляете target к UIButton
, поэтому вы выбралиФункция получает этот экземпляр UIButton.
Во втором сценарии вы добавляете target к UITapGestureRecognizer
, поэтому переданный экземпляр будет именно таким распознавателем жестов, который не может относится к типу UIImageView
.
Таким образом, отличие от целевого параметра в перспективе между UIGestureRecognizer
и UIButton
не имеет значения.Они оба передают свои экземпляры выбранной функции.
С точки зрения подкласса UIView
есть разница, что UIGestureRecognizer
не является подклассом UIView
, а UIButton
.Вот почему вы можете просто использовать переданный экземпляр UIButton
в своем первом фрагменте.Во втором фрагменте вам нужно использовать свойство view из UIGestureRecognizer
.
guard let imageView = gestureRecognizer.view as? UIImageView else { return }
Помимо вашего фактического вопроса, важно уточнить, как правильно писать #selector
s. Вы уже делаете это правильно. Никаких изменений не требуется.Некоторые могут сказать, что вам нужно добавить (_:)
или :
к вашему селектору, например так: #selector(handleSelectPhoto(_:))
, но это не так.В общем случае эти специальные символы нужно добавлять только при выборе метода, у которого есть метод перегрузки с другим количеством параметров, но с тем же базовым именем.