#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:)))
这时候调用的就是第二个方法。








网友评论