Selector

@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 的方法一般是這個樣子的:

-(void) callMe {
    //...
}

-(void) callMeWithParam:(id)obj {
    //...
}

SEL someMethod = @selector(callMe);
SEL anotherMethod = @selector(callMeWithParam:);

// 或者也可以使用 NSSelectorFromString
// SEL someMethod = NSSelectorFromString(@"callMe");
// SEL anotherMethod = NSSelectorFromString(@"callMeWithParam:");

一般為了方便矮嫉,很多人會選擇使用 @selector削咆,但是如果要追求靈活的話,可能會更愿意使用 NSSelectorFromString 的版本 -- 因為我們可以在運(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 中等效的寫法是:

func callMe() {
    //...
}

func callMeWithParam(obj: AnyObject!) {
    //...
}

let someMethod = #selector(callMe)
let anotherMethod = #selector(callMeWithParam(_:))

和 Objective-C 時一樣歼狼,記得在 callMeWithParam 后面加上冒號 (:),這才是完整的方法名字享怀。多個參數(shù)的方法名也和原來類似羽峰,是這個樣子:

func turnByAngle(theAngle: Int, speed: Float) {
    //...
}

let method = #selector(turnByAngle(_:speed:))

最后需要注意的是,selector 其實是 Objective-C runtime 的概念,如果你的 selector 對應(yīng)的方法只在 Swift 中可見的話 (也就是說它是一個 Swift 中的 private 方法)梅屉,在調(diào)用這個 selector 時你會遇到一個 unrecognized selector 錯誤:
這是錯誤代碼

private func callMe() {
     //...
}

NSTimer.scheduledTimerWithTimeInterval(1, target: self,
            selector:#selector(callMe), userInfo: nil, repeats: true)

正確的做法是在 private 前面加上 @objc 關(guān)鍵字值纱,這樣運(yùn)行時就能找到對應(yīng)的方法了。

@objc private func callMe() {
    //...
}

NSTimer.scheduledTimerWithTimeInterval(1, target: self,
             selector:#selector(callMe), userInfo: nil, repeats: true)

最后坯汤,值得一提的是计雌,如果方法名字在方法所在域內(nèi)是唯一的話,我們可以簡單地只是用方法的名字來作為 #selector 的內(nèi)容玫霎。相比于前面帶有冒號的完整的形式來說凿滤,這么寫起來會方便一些:

let someMethod = #selector(callMe)
let anotherMethod = #selector(callMeWithParam)
let method = #selector(turnByAngle)

但是,如果在同一個作用域中存在同樣名字的兩個方法庶近,即使它們的函數(shù)簽名不相同翁脆,Swift 編譯器也不允許編譯通過:

func commonFunc() {

}

func commonFunc(input: Int) -> Int {
    return input
}

let method = #selector(commonFunc)
// 編譯錯誤,`commonFunc` 有歧義

對于這種問題鼻种,我們可以通過將方法進(jìn)行強(qiáng)制轉(zhuǎn)換來使用:

let method1 = #selector(commonFunc as ()->())
let method2 = #selector(commonFunc as Int->Int)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末反番,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叉钥,更是在濱河造成了極大的恐慌罢缸,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件投队,死亡現(xiàn)場離奇詭異枫疆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)敷鸦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門息楔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扒披,你說我怎么就攤上這事值依。” “怎么了碟案?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵愿险,是天一觀的道長。 經(jīng)常有香客問我价说,道長辆亏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任熔任,我火速辦了婚禮褒链,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疑苔。我一直安慰自己甫匹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布抢韭。 她就那樣靜靜地躺著,像睡著了一般恍箭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扯夭,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音交洗,去河邊找鬼骑科。 笑死构拳,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的置森。 我是一名探鬼主播斗埂,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼凫海,長吁一口氣:“原來是場噩夢啊……” “哼呛凶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盐碱,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤把兔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瓮顽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡围橡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年暖混,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翁授。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡拣播,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出收擦,到底是詐尸還是另有隱情贮配,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布塞赂,位于F島的核電站泪勒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜圆存,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一叼旋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沦辙,春花似錦夫植、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至陌兑,卻和暖如春阐斜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诀紊。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工谒出, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人邻奠。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓笤喳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碌宴。 傳聞我的和親對象是個殘疾皇子杀狡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,679評論 0 9
  • 之前去XXXX公司面試被問到“怎樣使用performSelector傳入3個以上參數(shù)贰镣,其中一個為結(jié)構(gòu)體呜象?”當(dāng)時年少...
    Miu七七閱讀 7,751評論 2 16
  • 轉(zhuǎn)自原文鏈接 @selector是 Objective-C 時代的一個關(guān)鍵字,它可以將一個方法轉(zhuǎn)換并賦值給一個SE...
    Zakerberg閱讀 630評論 0 0
  • 由于種種原因碑隆,簡書等第三方平臺博客不再保證能夠同步更新恭陡,歡迎移步 GitHub:https://github.co...
    萌面大道閱讀 35,986評論 19 30
  • 三張數(shù)據(jù)表關(guān)系如圖: 其實出現(xiàn)表循環(huán)依賴情況:就是 同時 ConfigCompany和 Department 也...
    萬惡的Nickey閱讀 1,260評論 0 0