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

@objc方法使用单体内嵌Swift枚举报无法在Objective-C中表示错误如何修复

错误原因
  • 被@objc标记的方法会暴露给 Objective-C 运行时,所有参数类型都必须是 Objective-C 可识别的类型。
  • Swift 枚举要被 Objective-C 识别,必须同时满足两个条件:
    1. 显式添加@objc修饰符
    2. 原始值为整数类型(Objective-C 原生不支持字符串类型的枚举)
  • 你之前仅让外层类继承 NSObject,既没有给枚举加@objc修饰,且枚举用了 String 作为原始值,自然无法通过编译。
修复方案

方案1:调整枚举类型(推荐)

如果不需要依赖 String 原始值,直接修改枚举为 Int 原始值并添加@objc修饰,同时外层类继承 NSObject:

public class MessageManager: NSObject {
    public static var shared = MessageManager()
    private init () {}
    
    @objc public enum messageFlag: Int {
        case sensitive
    }
}

原有checkMessage方法不需要改动,可直接正常编译运行。

方案2:保留字符串枚举,调整方法参数

如果业务必须使用 String 类型的枚举原始值,可以把方法参数改为 String 类型,内部再转成枚举使用:

@objc func checkMessage (_sender: UIBarButtonItem? , messageId: String? = nil , flag: String ) {
    // 内部将字符串转为枚举
    guard let enumFlag = MessageManager.messageFlag(rawValue: flag) else {
        // 非法入参处理逻辑
        return
    }
    // 后续正常使用 enumFlag 即可
}

ObjC 侧调用时直接传入字符串@"sensitive"即可,功能不受影响。

内容的提问来源于stack exchange,提问作者Humble Fool

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 06:21:03