#selector()
里面的参数是需要调用的方法名。
在Swift中,#selector
常用于Timer
和UIBarButtonItem
等类中的target/action
方法中。例如,当您创建计时器时,您需要告诉它在计时器触发时通知谁(target)以及应该调用哪个#selector
(action)。对于bar button items
也是如此:当按下按钮时,应该调用哪个选择器,以及在什么对象上?
在Swift 2.2之前,#selector
的参数用的是字符串Selector(“buttonTapped:”)
,这种语法容易出现很多错别字。Swift 3提供了#selector
一种安全的语法。
Swift的#selector
与Objective-C的@selector
一样。Objective-C的选择器语法非常简单 - @selector(methodName:arguments:)
。Swift有点复杂。
Swift有函数重载overload
(同名,不同参数)的概念,而Objective-C没有。您可能需要消除#selector
引用哪个函数的歧义。
这是一个重载doStuff
方法:
class Thing {
...
func doStuff(stuff: Int) {
print("do Stuff \(stuff)")
}
func doStuff(stuff: Double, fluffy: String) {
print("do Stuff \(stuff) - \(fluffy)")
}
当您直接调用doStuff
时,Swift可以根据您传递的参数确定要使用哪一个。但用#selector
调用的话无法知道参数的类型。如果您尝试为其创建选择器doStuff
,则会出现模糊使用的error
。
解决方法是加入参数标签:
#selector(Thing.doStuff(stuff:fluffy:)))
这时候调用的就是第二个方法。
网友评论