创建 UIGestureRecognizer 时,为什么它的动作使用#selector?

When creating a UIGestureRecognizer, why does its action use a #selector?

以这段代码为例

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

为什么是动作#selector(MyClass.function)?为什么它不能只是 MyClass.function 而没有选择器包装?

来自 UIGestureRecognizer 文档:

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

所以很明显 action 将是 Selector 类型,这就是为什么你必须写 #selector(SomeClass.someFunction)

为了解决可能容易引入错误的简单拼写错误,Swift 2.2 弃用了对选择器使用字符串,而是引入了新语法:#selector.

参见:- https://swift.org/blog/swift-2-2-new-features/ (编译时检查选择器)

#selector 只是检查语法的函数的包装器。它仅测试您声明的方法是否存在于您的代码中。这样你就可以避免 Objective-C 选择器字符串中的错字之类的错误。

您不能像您建议的那样将指针传递给 func,因为在引擎盖下选择器的工作方式与调用方法几乎没有其他方式。

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

您可以避免在 #selector 中使用 class 名称。传#selector(yourMethod)#selector(yourMethodWithParam(_:))也有效。