IOS&swift中#selector的怪異語法

#selector()里面的參數(shù)是需要調用的方法名。

在Swift中,#selector常用于TimerUIBarButtonItem等類中的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:)))

這時候調用的就是第二個方法。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容