Swift闭包变量无法在Objective-C类中访问的问题排查
解决Swift闭包变量无法在Objective-C中访问的问题
嘿,这个问题我之前也踩过坑,本质就是Swift和Objective-C交互时的类型兼容问题,咱们一步步来搞定它:
问题根源
你的purchaseStatusBlock闭包在OC里找不到,主要是两个原因:
- 闭包属性没加
@objc修饰符,Swift默认不会把这种属性导出到Objective-C的桥接头文件里; - 闭包的参数
IAPHelperAlertType应该是Swift独有的枚举,如果没做@objc兼容处理,OC完全识别不了这个类型,连带依赖它的闭包属性也没法被OC识别。
解决方案步骤
1. 让IAPHelperAlertType枚举兼容Objective-C
先修改你的枚举定义,给它加上@objc修饰,并且继承自Int(OC只能识别继承自NSInteger的Swift枚举):
@objc enum IAPHelperAlertType: Int { case purchased // 其他枚举值... // 如果有自定义方法,比如你用到的message(),也要加@objc让OC能调用 @objc func message() -> String { switch self { case .purchased: return "购买成功" // 其他case的处理逻辑... } } }
2. 给闭包属性添加@objc修饰
修改IAPHelper类里的闭包变量,加上@objc,如果是异步回调场景,最好再加上@escaping避免生命周期问题:
@objc class IAPHelper: NSObject { static let shared = IAPHelper() @objc var purchaseStatusBlock: ((IAPHelperAlertType) -> Void)? }
3. 在Objective-C中正确调用闭包
现在就能在OC类里正常访问这个block了,按照OC的block语法来赋值:
#import "VMedu-Swift.h" @interface FreeSubscriptionController () @end @implementation FreeSubscriptionController - (void)viewDidLoad { [super viewDidLoad]; // 你的其他代码... __weak typeof(self) weakSelf = self; IAPHelper.shared.purchaseStatusBlock = ^(IAPHelperAlertType type) { typeof(self) strongSelf = weakSelf; if (type == IAPHelperAlertTypePurchased) { // 这里写你的业务逻辑,比如显示弹窗 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:[type message] preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { NSLog(@"product purchased"); }]]; [strongSelf presentViewController:alert animated:YES completion:nil]; } }; } @end
最后验证
修改完记得先clean项目(Cmd+Shift+K),再重新编译,这样生成的VMedu-Swift.h头文件里就会包含这个purchaseStatusBlock属性,OC编译器就不会报错了。
内容的提问来源于stack exchange,提问作者IOS Dev
相关产品推荐
相关产品推荐

