以此代码为例。创建UIGestureRecognizer时,为什么它的动作使用#selector?
let swipe = UISwipeGestureRecognizer(
target: self, action: #selector(SomeClass.someFunction)
为什么是动作#selector(MyClass.function)
?为什么不能只是MyClass.function
没有选择包装?
以此代码为例。创建UIGestureRecognizer时,为什么它的动作使用#selector?
let swipe = UISwipeGestureRecognizer(
target: self, action: #selector(SomeClass.someFunction)
为什么是动作#selector(MyClass.function)
?为什么不能只是MyClass.function
没有选择包装?
#selector
只是封装器,该检查语构函数。它只测试你声明的方法是否存在于你的代码中。这样你就可以避免像objectiv-c选择器字符串中的错字。
您不能将指针传递给func,因为在引擎盖选择器中以其他方式工作,然后调用方法。
我认为它就像在目标上执行选择器一样工作,而不是简单地调用选择器方法。
您可以避免在#selector
中使用类名称。通过#selector(yourMethod)
或#selector(yourMethodWithParam(_:))
也是有效的。
只有在'self'中声明'Selector'方法时才能绕过类名称。 –
从UIGestureRecognizer
DOC:
public init(target: AnyObject?, action: Selector) // designated initializer
所以很明显,action
将Selector
型这就是为什么你必须写#selector(SomeClass.someFunction)
为了解决简单的拼写错误,可以很容易地引入错误,雨燕2.2不赞成使用字符串对于选择器,而是引入新的语法:#选择器。
请参阅: - https://swift.org/blog/swift-2-2-new-features/ (编译时检查选择器)
这与遗留代码和Objective-C有关。该API是在有Objective-C并且使用消息发送范例时设计的。 ''objc_msgSend'''。 – kandelvijaya