Swift 和 OC之间传递包含block的NSDictionary

Swift 和 OC之间传递包含block的NSDictionary

Swift 之间:

1
2
3
4
5
6
7
8
9
// 放入
let params = [
"callback":callback
] as [AnyHashable : Any]

// 读取
if let callback = params["callback"] as? (String) -> Void {
callback("success")
}

Objcective-C 之间:

1
2
3
4
5
6
7
8
9
10
// 放入
NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
params[@"callback"] = callback;

// 读取
typedef void (^CallbackType)(NSString *);
CallbackType callback = params[@"callback"];
if (callback) {
callback(@"success");
}

Swift 和 OC之间传递 NSDictionary 如果包含 block需注意:

Swift -> Objective-C

1
2
3
4
// Swift传入 需转换
let callbackBlock = callback as @convention(block) (String) -> Void
let callbackBlockObject = unsafeBitCast(callbackBlock, to: AnyObject.self)
let params = ["callback":callbackBlockObject] as [AnyHashable:Any]
1
2
3
4
5
6
// Objective-C 正常读取
typedef void (^CallbackType)(NSString *);
CallbackType callback = params[@"callback"];
if (callback) {
callback(@"success");
}

Objective-C -> Swift

1
2
3
// Objective-C 正常传入
NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
params[@"callback"] = callback;
1
2
3
4
5
6
7
// Swift 需转换
if let block = params["callback"] {
typealias CallbackType = @convention(block) (NSString) -> Void
let blockPtr = UnsafeRawPointer(Unmanaged<AnyObject>.passUnretained(block as AnyObject).toOpaque())
let callback = unsafeBitCast(blockPtr, to: CallbackType.self)
callback("success")
}