@objc方法使用单体内嵌Swift枚举报无法在Objective-C中表示错误如何修复
错误原因
- 被
@objc标记的方法会暴露给 Objective-C 运行时,所有参数类型都必须是 Objective-C 可识别的类型。 - Swift 枚举要被 Objective-C 识别,必须同时满足两个条件:
- 显式添加
@objc修饰符 - 原始值为整数类型(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
相关产品推荐
相关产品推荐

