#selector()里面的參數(shù)是需要調用的方法名。
在Swift中,#selector常用于Timer和UIBarButtonItem等類中的target/action方法中。例如,當您創(chuàng)建計時器時,您需要告訴它在計時器觸發(fā)時通知誰(target)以及應該調用哪個#selector(action)。對于bar button items也是如此:當按下按鈕時,應該調用哪個選擇器,以及在什么對象上?
在Swift 2.2之前,#selector的參數(shù)用的是字符串Selector(“buttonTapped:”),這種語法容易出現(xiàn)很多錯別字。Swift 3提供了#selector一種安全的語法。
Swift的#selector與Objective-C的@selector 一樣。Objective-C的選擇器語法非常簡單 - @selector(methodName:arguments:)。Swift有點復雜。
Swift有函數(shù)重載overload(同名,不同參數(shù))的概念,而Objective-C沒有。您可能需要消除#selector引用哪個函數(shù)的歧義。
這是一個重載doStuff方法:
class Thing {
...
func doStuff(stuff: Int) {
print("do Stuff \(stuff)")
}
func doStuff(stuff: Double, fluffy: String) {
print("do Stuff \(stuff) - \(fluffy)")
}
當您直接調用doStuff時,Swift可以根據(jù)您傳遞的參數(shù)確定要使用哪一個。但用#selector調用的話無法知道參數(shù)的類型。如果您嘗試為其創(chuàng)建選擇器doStuff,則會出現(xiàn)模糊使用的error。
解決方法是加入?yún)?shù)標簽:
#selector(Thing.doStuff(stuff:fluffy:)))
這時候調用的就是第二個方法。