iOS Swift&OC 闭包和Block 相互转化

一、Swift的闭包 -> OC的Block

   self.swiftCallback = {(_ content:String) in
        print("获取OC数据成功 = \(content)")
    }
    // Swift的闭包 - > OC的Block ,blockObject就是闭包转化后的Block
    let block = swiftCallback! as @convention(block) (String) -> Void
    let blockObject = unsafeBitCast(block, to: AnyObject.self)
    
    // 可将blockObject作为参数传入OC项目,调用OC方法testAcceptClosure
    var parameter = [AnyHashable : Any]()
    parameter["callback"] = blockObject
    ViewController.testAcceptClosure(parameter)

二、OC的Block -> Swift的闭包

    let callback = parameter["callback"]
    if(callback != nil){
        // OC的Block - >Swift的闭包,closure就是Block转化后的闭包
        typealias ClosureType = @convention(block) (String) -> Void
        let blockPtr = UnsafeRawPointer(Unmanaged<AnyObject>.passUnretained(callback as AnyObject).toOpaque())
        let closure = unsafeBitCast(blockPtr, to: ClosureType.self)
        closure("我是来自Swift的数据哦 ~~~")
    }

三、示例

目录

截屏2022-12-09 下午4.45.21.png

OC代码

    #import "ViewController.h"
    #import <BlockTest-Swift.h>

    typedef void(^OCBlock)(NSString* content);

    @interface ViewController ()
    @property(nonatomic, strong)SwiftViewController *swiftVC;
    @property(nonatomic, copy)OCBlock swiftCallBack;

    @end

    @implementation ViewController

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.swiftVC = [[SwiftViewController alloc] init];
    }

    -(void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:animated];
        [self testAcceptDataFromSwift];
    }
    //  传递Block至Swift页面 并接收回调数据
    - (void)testAcceptDataFromSwift{
        self.swiftCallBack = ^(NSString *content) {
            NSLog(@"获取Swift数据成功 = %@",content);
        };
        NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
        [dic setValue:self.swiftCallBack forKey: @"callback"];
        //  调用swift方法
        [self.swiftVC sendDataWithBlockWithParameter:dic];
    }

    //  接收Swift传递的Block,调用并回传数据
    + (void)testAcceptClosure:(NSDictionary *)parameter{
        //  接收Block
        OCBlock callBack = parameter[@"callback"];
        //  数据回调
        if (callBack) {
            callBack(@"我是来自OC的数据哦 ~~~");
        }
    }

Swift代码

    import UIKit
    /// Swift闭包
    typealias SwiftCallback = ((String) -> Void)

    class SwiftViewController: UIViewController {

        var swiftCallback:SwiftCallback?

        override func viewDidLoad() {
            super.viewDidLoad()
            acceptDataWithClosure()
        }
        // 传递Block至OC ,并接收回调数据
        func acceptDataWithClosure(){
            self.swiftCallback = {(_ content:String) in
                print("获取OC数据成功 = \(content)")
            }
            // Swift的闭包 - > OC的Block ,blockObject就是闭包转化后的Block
            let block = swiftCallback! as @convention(block) (String) -> Void
            let blockObject = unsafeBitCast(block, to: AnyObject.self)
    
            // 可将blockObject作为参数传入OC项目,调用OC方法testAcceptClosure
            var parameter = [AnyHashable : Any]()
            parameter["callback"] = blockObject
            ViewController.testAcceptClosure(parameter)
        }

        // 接收OC传递的Block,调用并回传数据
        @objc func sendDataWithBlock(parameter:[AnyHashable : Any]){
            let callback = parameter["callback"]
            if(callback != nil){
                //  OC的Block - >Swift的闭包,closure就是Block转化后的闭包
                typealias ClosureType = @convention(block) (String) -> Void
                let blockPtr = UnsafeRawPointer(Unmanaged<AnyObject>.passUnretained(callback as AnyObject).toOpaque())
                let closure = unsafeBitCast(blockPtr, to: ClosureType.self)
                closure("我是来自Swift的数据哦 ~~~")
            }
        }
    }

日志输出

截屏2022-12-09 下午4.48.20.png

文章持续更新中、希望对各位有所帮助、有问题可留言 大家共同学习.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容