Swift 與 OC 用字典互傳 Block

這種情況我是在用 CTMediator 時(shí) Swift 與 OC 相互傳值回調(diào)用到的龟劲,記錄一下。

1.OC 給 Swift 用字典傳 Block

1) OC 代碼正常寫
2) Swift 拿到 block 后善炫,需要轉(zhuǎn)為兼容 Swift 的 block
    /*
     1) 拿到原始 block
     */
    let block = params["reslutBlock"]
    
    /*
     2) 定義對(duì)應(yīng)類型的 block 別名,用 @convention(block) 修飾
     @convention(swift) block類型 :聲明這是swift block
     @convention(block) block類型 :聲明這是兼容swift | oc 的 block
     @convention(c)     block類型 :聲明這是c block
 
     BlockType       : 別名
     (NSString) -> Void : 傳入的 block 類型
     */
    typealias BlockType = @convention(block) (NSString) -> Void
 
    /*
     3) 獲取 block 的內(nèi)存地址
     Unmanaged: 用于傳播非托管對(duì)象引用的類型(不用ARC)
     Unmanaged.passRetained       : 如果這個(gè)非托管對(duì)象的使用全程,能夠保障被封裝對(duì)象一直存活肩豁,我們就可以使用 passUnretained 方法,對(duì)象的生命周期還歸編譯器管理
     Unmanaged.passUnretained     : 如果非托管對(duì)象使用周期超過了編譯器認(rèn)為的生命周期辫呻,比如超出作用域清钥,編譯器自動(dòng)插入 release 的 ARC 語義,那么這個(gè)非托管對(duì)象就是一個(gè)野指針了放闺,此時(shí)我們必須手動(dòng) retain 這個(gè)對(duì)象祟昭,也就是使用 passRetained 方法
     一旦你手動(dòng) retain 了一個(gè)對(duì)象,就不要忘記 release 掉它怖侦,方法就是調(diào)用非托管對(duì)象的 release 方法从橘,或者用 takeRetainedValue 取出封裝的對(duì)象,并將其管理權(quán)交回 ARC础钠。但注意恰力,一定不要對(duì)一個(gè)用 passUnretained 構(gòu)造的非托管對(duì)象調(diào)用 release 或者 takeRetainedValue,這會(huì)導(dǎo)致原來的對(duì)象被 release 掉旗吁,從而引發(fā)異常踩萎。
    */
    let blockPtr = UnsafeRawPointer(Unmanaged<AnyObject>.passUnretained(block as AnyObject).toOpaque())
 
    /*
     4) 根據(jù) 2.3 的內(nèi)存地址將內(nèi)存里的內(nèi)容轉(zhuǎn)為 2.2 定義的類型
     unsafeBitCast(x, to: type) :將x內(nèi)存地址的內(nèi)容強(qiáng)轉(zhuǎn)為 type 類型的內(nèi)容
 
     blockPtr     : 地址
     BlockType : block 類型
     */
    let newBlock = unsafeBitCast(blockPtr, to: BlockType.self)

2.Swift 給 OC 用字典傳 Block

1) OC 代碼正常寫
2) Swift 先把 block_1 轉(zhuǎn)化為 兼容 Swift | OC 的 block _2
再將 block _2 轉(zhuǎn)化為 AnyObject 傳入字典
    /*
     1) 定義 block
     (String) -> Void    :自定義類型
     */
    let block: (String) -> Void = { param in
        // 業(yè)務(wù)邏輯
    }
    
    /*
     2) 將 block 轉(zhuǎn)化為兼容 Swift | OC 的 block
     
     (String) -> Void   : block 類型
     注意: 這里的 block 類型需要與 2.1 定義時(shí)的類型一致
     */
    let compatibilityBlock = block as @convention(block) (String) -> Void
 
    /*
     3) 將兼容 block 轉(zhuǎn)化為 AnyObject
     */
    let compatibilityBlockObject = unsafeBitCast(compatibilityBlock, to: AnyObject.self)
 
    /*
     4) 作為參數(shù)保存
     */
    let param = [
        "reslutBlock" : compatibilityBlockObject,
    ] as [String : Any]

參考:
swift的@convention
Swift-Unmanaged使用
[Swift] 指針UnsafePointer

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市很钓,隨后出現(xiàn)的幾起案子香府,更是在濱河造成了極大的恐慌,老刑警劉巖码倦,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件企孩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡袁稽,警方通過查閱死者的電腦和手機(jī)勿璃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人补疑,你說我怎么就攤上這事歧沪。” “怎么了莲组?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵诊胞,是天一觀的道長。 經(jīng)常有香客問我锹杈,道長撵孤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任竭望,我火速辦了婚禮邪码,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘市框。我一直安慰自己霞扬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布枫振。 她就那樣靜靜地躺著喻圃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粪滤。 梳的紋絲不亂的頭發(fā)上斧拍,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音杖小,去河邊找鬼肆汹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛予权,可吹牛的內(nèi)容都是我干的昂勉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼扫腺,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼岗照!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起笆环,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤攒至,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后躁劣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迫吐,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年账忘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了志膀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熙宇。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖梧却,靈堂內(nèi)的尸體忽然破棺而出奇颠,到底是詐尸還是另有隱情败去,我是刑警寧澤放航,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站圆裕,受9級(jí)特大地震影響广鳍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吓妆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一赊时、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧行拢,春花似錦祖秒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沼瘫,卻和暖如春抬纸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耿戚。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工湿故, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膜蛔。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓坛猪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親皂股。 傳聞我的和親對(duì)象是個(gè)殘疾皇子墅茉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355