轉(zhuǎn)自?原文鏈接
@selector是 Objective-C 時代的一個關(guān)鍵字,它可以將一個方法轉(zhuǎn)換并賦值給一個SEL類型选脊,它的表現(xiàn)很類似一個動態(tài)的函數(shù)指針。在 Objective-C 時 selector 非常常用羊始,從設(shè)定 target-action浑吟,到自舉詢問是否響應(yīng)某個方法笙纤,再到指定接受通知時需要調(diào)用的方法等等,都是由 selector 來負(fù)責(zé)的组力。在 Objective-C 里生成一個 selector 的方法一般是這個樣子的:
一般為了方便省容,很多人會選擇使用@selector,但是如果要追求靈活的話燎字,可能會更愿意使用NSSelectorFromString的版本 -- 因?yàn)槲覀兛梢栽谶\(yùn)行時動態(tài)生成字符串蓉冈,從而通過方法的名字來調(diào)用到對應(yīng)的方法。
在 Swift 中沒有@selector了轩触,取而代之寞酿,從 Swift 2.2 開始我們使用#selector來從暴露給 Objective-C 的代碼中獲取一個 selector。類似地脱柱,在 Swift 里對應(yīng)原來SEL的類型是一個叫做Selector的結(jié)構(gòu)體伐弹。像上面的兩個例子在 Swift 中等效的寫法是:
和 Objective-C 時一樣,記得在callMeWithParam后面加上冒號 (:)榨为,這才是完整的方法名字惨好。多個參數(shù)的方法名也和原來類似,是這個樣子
最后需要注意的是随闺,selector 其實(shí)是 Objective-C runtime 的概念日川,如果你的 selector 對應(yīng)的方法只在 Swift 中可見的話 (也就是說它是一個 Swift 中的 private 方法),在調(diào)用這個 selector 時你會遇到一個 unrecognized selector 錯誤
這是錯誤的代碼
正確的做法是在private前面加上@objc關(guān)鍵字矩乐,這樣運(yùn)行時就能找到對應(yīng)的方法了龄句。
最后回论,值得一提的是,如果方法名字在方法所在域內(nèi)是唯一的話分歇,我們可以簡單地只是用方法的名字來作為#selector的內(nèi)容傀蓉。相比于前面帶有冒號的完整的形式來說,這么寫起來會方便一些:
但是职抡,如果在同一個作用域中存在同樣名字的兩個方法葬燎,即使它們的函數(shù)簽名不相同,Swift 編譯器也不允許編譯通過:
對于這種問題缚甩,我們可以通過將方法進(jìn)行強(qiáng)制轉(zhuǎn)換來使用: