Ios 创建UIGestureRecognitor时,其操作为什么使用#选择器?

Ios 创建UIGestureRecognitor时,其操作为什么使用#选择器?,ios,swift,uigesturerecognizer,selector,Ios,Swift,Uigesturerecognizer,Selector,以这段代码为例 let swipe = UISwipeGestureRecognizer( target: self, action: #selector(SomeClass.someFunction) 为什么操作选择器(MyClass.function)?为什么不使用选择器包装就不能成为MyClass.function呢?来自UIgestureRecognitizerdoc: public init(target: AnyObject?, action: Select

以这段代码为例

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

为什么操作选择器(MyClass.function)?为什么不使用选择器包装就不能成为MyClass.function呢?

来自
UIgestureRecognitizer
doc:

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

因此很明显,
操作
将是
选择器
类型,这就是为什么您必须编写
#选择器(SomeClass.someFunction)
为了解决容易引入错误的简单打字错误,Swift 2.2不赞成使用字符串作为选择器,而是引入了新语法:#选择器

见:- (编译时检查选择器)

#选择器
只是检查语法的函数的包装器。它只在您声明的方法存在于代码中时才进行测试。这样可以避免像Objective-C选择器字符串中的打字错误这样的错误

你们不能像你们建议的那个样将指针传递给func,因为引擎盖下的选择器的工作方式和调用方法几乎并没有什么不同

我认为它的工作原理类似于在目标上执行选择器,而不是简单地调用选择器方法


您可以避免在
#选择器
中使用类名。传递
#选择器(yourMethod)
#选择器(yourMethodWithParam(:)
也有效

这与遗留代码和Objective-C有关。API是在有Objective-C时设计的,它使用消息发送范式``objc\u msgSend```。只有在为
self
中存在的方法声明
Selector
时,才能绕过类名。