Swift类未遵循Objective-C协议排查:Xcode生成代码仍报错
问题根源与解决方案
这个问题其实是Swift和Objective-C桥接时的兼容性问题导致的,主要有两个核心原因:
1. Swift类未被Objective-C runtime识别
你的Objective-C协议Class1继承自NSObject协议,这意味着遵循它的类需要具备Objective-C兼容性。纯Swift类(既不继承NSObject,也没有标记@objc相关修饰)无法被Objective-C runtime感知,即使你实现了方法,编译器也会认为你没有满足协议要求。
2. 方法未暴露给Objective-C(或选择器不匹配)
Xcode自动生成的func search(by searchType: Enum1)方法,默认情况下是纯Swift方法,不会暴露给Objective-C。而Objective-C协议的方法检查依赖runtime来验证方法存在性,所以必须让这个方法能被Objective-C识别。
具体解决方案
方案一:让Swift类继承NSObject(最常用)
直接继承NSObject会自动让类具备Objective-C兼容性,同时方法也会默认暴露给Objective-C:
class MySwiftClass: NSObject, Class1 { func search(by searchType: Enum1) { // 这里写你的实现逻辑 } }
方案二:不继承NSObject,用@objc标记类和方法
如果你的类不需要继承NSObject,可以用@objc修饰类和方法,强制让它们暴露给Objective-C:
@objc class MySwiftClass: Class1 { @objc func search(by searchType: Enum1) { // 实现代码 } }
或者用@objcMembers一次性标记所有成员,简化代码:
@objcMembers class MySwiftClass: Class1 { func search(by searchType: Enum1) { // 实现代码 } }
额外检查:确保Enum1是正确桥接的
如果上面的方法还是不行,检查你的Objective-C枚举Enum1是否用NS_ENUM定义:
// 正确的枚举定义方式 typedef NS_ENUM(NSInteger, Enum1) { Enum1Type1, Enum1Type2 };
普通的C枚举(没有用NS_ENUM)在Swift中桥接会有问题,导致类型不匹配,进而触发协议不兼容的错误。
内容的提问来源于stack exchange,提问作者Karnika Advani
相关产品推荐
相关产品推荐

