在Objective-C中调用Swift方法报错:找不到User类的isReady选择器
解决Objective-C调用Swift方法时的
No visible @interface for "User" declares the selector "isReady"错误 问题根源
你的Swift方法isReady(isTrue: Bool) -> Bool是带参数的,但Objective-C调用时既没传参数,也没使用正确的Objective-C方法签名。加上Swift参数标签到Objective-C的转换规则,这就是报错的核心原因,咱们一步步修正:
步骤1:理解Swift到Objective-C的方法签名转换
用@objcMembers标记Swift类后,这个带参数的方法会被自动暴露给Objective-C,但默认的签名会变成:
- (BOOL)isReadyWithIsTrue:(BOOL)isTrue;
(Swift的第一个外部参数标签会被拼接到方法名后,用With连接,这是苹果默认的转换逻辑)
步骤2:修正Objective-C调用代码
你需要传入对应的布尔参数,同时使用正确的selector调用:
User *user = [[User alloc] init]; BOOL result = [user isReadyWithIsTrue:YES]; // 按需传入YES/NO
可选:自定义更简洁的Objective-C方法名
如果你觉得默认生成的方法名太长,可以在Swift方法上用@objc指定自定义的Objective-C selector:
@objcMembers class User: NSObject { // 指定Objective-C里的方法名为isReady: @objc(isReady:) func isReady(isTrue: Bool) -> Bool { return true } }
这样Objective-C里就能用更简洁的方式调用:
BOOL result = [user isReady:YES];
额外排查(如果上述方法无效)
- 确认项目已正确配置桥接文件(通常命名为
YourProjectName-Bridging-Header.h),确保Swift类User能被Objective-C识别。 - 尝试Clean项目(
Cmd + Shift + K)后重新Build,有时候缓存会导致方法签名不更新。
内容的提问来源于stack exchange,提问作者nanana
相关产品推荐
相关产品推荐

