swift closure 与 oc block 转换

有时候我们不会直接调用block或closure,而是将其保存到内存中延后使用。
而此时,swift 和 oc之间相互调用则会出现问题。

解决:
情景1:swift 的closure 给 oc 调用
将swift的closure定义前加上 @convention(block) ,这样定义出的closure就是oc的block结构,可以传给oc调用。

情景2:oc 的block给closure调用
oc里面是不会有情景1的方法,所以只能在swift层自己进行转换,因为swift是支持调用oc结构的block的,但是需要处理。
由于oc保存时将block放到内存,此时定义的是id类型,而swift获取时拿到的是AnyObject或者Any,不是closure,因此要将AnyObject换成closure。
如下:假设block保存在dictionary

if let cb = params?["callBack"] {
    callBack = unsafeBitCast(cb as AnyObject, to: BSActionsCallBack.self)
}

你可能感兴趣的:(swift closure 与 oc block 转换)