OC混編Swift中代理設(shè)計(jì)模式的小坑

  • 今天我在OC混編Swift的項(xiàng)目中使用代理(委托)設(shè)計(jì)模式傳值的時(shí)候被一個(gè)小小的語法問題給絆了好長時(shí)候无蜂,本來擼代碼擼的正嗨的時(shí)候喇完,被這個(gè)小點(diǎn)給懟蒙了。特此寫下此文警示后人??蹬耘。

1,具體場(chǎng)景

  • 用Swift寫了一個(gè)view芝雪,OC寫的控制器擁有這個(gè)view的引用,展示view综苔,然后Swift需要使用代理回傳值給OC惩系。

2,二話不說上代碼

  • 代理回傳值一般需要這樣幾步:
    • 定義協(xié)議
// 1如筛,定義協(xié)議
protocol SwiftViewDelegate {
    func removeSwiftView()
 }
  • 添加代理屬性
// 2堡牡,添加代理屬性
    var delegate : SwiftViewDelegate?
  • 調(diào)用代理方法 (以上三步是在需要代理的類中寫的)
// 3,調(diào)用代理方法
 self.delegate?.removeSwiftView()
  • 設(shè)置代理
self.swiftView.delegate = self;
  • 遵守協(xié)議
@interface ViewController ()<SwiftViewDelegate>

3杨刨,上面的這個(gè)套路在OC或者Swift中 完全沒有問題晤柄。但是當(dāng)把Swift的代理設(shè)置給OC的時(shí)候或者OC類遵守協(xié)議的時(shí)候就會(huì)報(bào)錯(cuò)

  Property 'delegate' not found on object of type 'SwiftView *'

  提示你找不到代理屬性,可是已經(jīng)在Swift中已經(jīng)定義了啊
  Cannot find protocol declaration for 'SwiftViewDelegate'
  我擦妖胀,這是啥情況芥颈,我明明在Swift類中定義了協(xié)議并且在OC中導(dǎo)入了"XXX-Swift.h"頭文件 怎么就找不到SwiftViewDelegate

4,什么原因呢

  • 查找Swift3.0翻譯文檔 發(fā)現(xiàn)了這句話
  “可選的協(xié)議要求只能用在標(biāo)記 @objc 特性的協(xié)議中。
該特性表示協(xié)議將暴露給 Objective-C 代碼赚抡,詳情參見Using Swift with Cocoa and Objective-C(Swift 2.2)爬坑。即使你不打算和 Objective-C 有什么交互,如果你想要指定可選的協(xié)議要求怕品,那么還是要為協(xié)議加上 @objc 特性妇垢。
還需要注意的是,標(biāo)記 @objc 特性的協(xié)議只能被繼承自 Objective-C 類的類或者 @objc 類采納肉康,其他類以及結(jié)構(gòu)體和枚舉均不能采納這種協(xié)議闯估。”
  • 因?yàn)镾wift中協(xié)議中的方法默認(rèn)是必須實(shí)現(xiàn)的吼和,OC中協(xié)議中的方法默認(rèn)都是可選實(shí)現(xiàn)的涨薪。Swift中定義的協(xié)議默認(rèn)是不暴漏給OC的,如果想在OC中使用協(xié)議,需要在定義協(xié)議的時(shí)候 在前面加上@objc 告訴OC
  • 協(xié)議加上@objc 后 協(xié)議中定義的方法都變?yōu)榭蛇x實(shí)現(xiàn)的了炫乓。

5,正確姿勢(shì)

@objc protocol SwiftViewDelegate {
    
    func removeSwiftView()
}
  

6,demo源碼

https://github.com/JTWang4778/DelegateInOCSwfit.git

7,對(duì)于@objc的詳細(xì)作用請(qǐng)參考文章

http://www.cnblogs.com/Rinpe/p/5466470.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刚夺,一起剝皮案震驚了整個(gè)濱河市献丑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侠姑,老刑警劉巖创橄,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異莽红,居然都是意外死亡妥畏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門安吁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來醉蚁,“玉大人,你說我怎么就攤上這事鬼店⊥鳎” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵妇智,是天一觀的道長滥玷。 經(jīng)常有香客問我,道長俘陷,這世上最難降的妖魔是什么罗捎? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮拉盾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘豁状。我一直安慰自己捉偏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布泻红。 她就那樣靜靜地躺著夭禽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谊路。 梳的紋絲不亂的頭發(fā)上讹躯,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音缠劝,去河邊找鬼潮梯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛惨恭,可吹牛的內(nèi)容都是我干的秉馏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼脱羡,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼萝究!你這毒婦竟也來了免都?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤帆竹,失蹤者是張志新(化名)和其女友劉穎绕娘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栽连,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡业舍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了升酣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舷暮。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖噩茄,靈堂內(nèi)的尸體忽然破棺而出下面,到底是詐尸還是另有隱情,我是刑警寧澤绩聘,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布沥割,位于F島的核電站,受9級(jí)特大地震影響凿菩,放射性物質(zhì)發(fā)生泄漏机杜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一衅谷、第九天 我趴在偏房一處隱蔽的房頂上張望椒拗。 院中可真熱鬧,春花似錦获黔、人聲如沸蚀苛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽堵未。三九已至,卻和暖如春盏触,著一層夾襖步出監(jiān)牢的瞬間渗蟹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工赞辩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雌芽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓诗宣,卻偏偏與公主長得像膘怕,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子召庞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359