有時候我們不會直接調(diào)用block或closure港谊,而是將其保存到內(nèi)存中延后使用坐桩。
而此時,swift 和 oc之間相互調(diào)用則會出現(xiàn)問題封锉。
解決:
情景1:swift 的closure 給 oc 調(diào)用
將swift的closure定義前加上 @convention(block) ,這樣定義出的closure就是oc的block結(jié)構(gòu)膘螟,可以傳給oc調(diào)用成福。
情景2:oc 的block給closure調(diào)用
oc里面是不會有情景1的方法,所以只能在swift層自己進行轉(zhuǎn)換荆残,因為swift是支持調(diào)用oc結(jié)構(gòu)的block的奴艾,但是需要處理。
由于oc保存時將block放到內(nèi)存内斯,此時定義的是id類型蕴潦,而swift獲取時拿到的是AnyObject或者Any像啼,不是closure,因此要將AnyObject換成closure潭苞。
如下:假設(shè)block保存在dictionary
if let cb = params?["callBack"] {
callBack = unsafeBitCast(cb as AnyObject, to: BSActionsCallBack.self)
}