You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift闭包变量无法在Objective-C类中访问的问题排查

解决Swift闭包变量无法在Objective-C中访问的问题

嘿,这个问题我之前也踩过坑,本质就是Swift和Objective-C交互时的类型兼容问题,咱们一步步来搞定它:

问题根源

你的purchaseStatusBlock闭包在OC里找不到,主要是两个原因:

  1. 闭包属性没加@objc修饰符,Swift默认不会把这种属性导出到Objective-C的桥接头文件里;
  2. 闭包的参数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:15:50