创建 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(_:))
也有效。
以这段代码为例
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(_:))
也有效。