一、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
文章持续更新中、希望对各位有所帮助、有问题可留言 大家共同学习.