2016-08-16 2 views
1

Возьмите этот код, например.При создании UIGestureRecognizer, почему его действие использует #selector?

let swipe = UISwipeGestureRecognizer(
     target: self, action: #selector(SomeClass.someFunction) 

Почему действие #selector(MyClass.function)? Почему он не может быть MyClass.function без упаковки селектора?

+1

Это связано с устаревшим кодом и Objective-C. API был разработан, когда был Objective-C, и он использует парадигму отправки сообщений. '' Objc_msgSend'''. – kandelvijaya

ответ

2

#selector просто обертка на функции, которые проверяют синтактику. Он проверяет, только если метод, который вы заявляете, существует в вашем коде. Таким образом, вы избежите ошибок, таких как опечатка в цепочках селекторов objectiv-c.

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

Я думаю, что это работает как выполнить селектор цели, а не просто вызвать селекторный метод.

Вы можете избежать использования имени класса в #selector. Pass #selector(yourMethod) или #selector(yourMethodWithParam(_:)) также действителен.

+0

Вы можете обойти имя класса, только если вы объявляете 'Selector' для метода, существовавшего в' self'. –

0

С UIGestureRecognizer документа:

public init(target: AnyObject?, action: Selector) // designated initializer 

Так это ясно, что action будет Selector Вот типа почему вы должны написать #selector(SomeClass.someFunction)

0

Для решения простых опечаток, которые могут легко ввести ошибки, Swift 2,2 осуждает использование строк для селекторов и вместо этого вводит новый синтаксис: #selector.

См: - https://swift.org/blog/swift-2-2-new-features/ (время компиляции проверяется селекторы)