NSClassFromString调用fetchCloudValues提示GIDSignIn无该selector编译错误
问题原因
- Objective-C 编译器对
Class类型变量调用方法时,无法确定方法返回值的具体类型,会全局匹配所有同名的已知 selector。由于你的项目中GIDSignIn类存在同名的sharedInstance类方法,编译器错误将此处[asdasd sharedInstance]的返回值推断为GIDSignIn *类型,因此调用fetchCloudValues时抛出了GIDSignIn不存在该 selector 的错误。 - 你没有将自定义 Swift 类的接口暴露给当前 Objective-C 代码所属的 target,编译器不知道
Test类存在对应的fetchCloudValues方法,无法做正确的类型校验。 - 如果你编写这段 Objective-C 代码的 target 和
CheckUpdate类归属的 target 不一致,运行时NSClassFromString(@"Test")也会返回 nil,即使编译通过也无法正常执行逻辑。
解决方案
你可以根据自己的项目需求选择以下任意一种方案解决:
- 统一 target 归属
检查CheckUpdate类的成员归属,确保它被加入到编写这段 Objective-C 代码的 target 中,否则运行时无法找到对应的类。 - 暴露 Swift 类接口给 Objective-C
在编写这段 OC 代码的文件顶部导入当前 target 自动生成的 Swift 桥接头,格式为:
#import "你的Target名称-Swift.h"
如果不想导入整个桥接头,也可以在 OC 文件顶部手动声明类接口:
@interface Test : NSObject + (instancetype)sharedInstance; - (void)fetchCloudValues; @end
- 规避编译器类型推断问题
如果不想暴露类接口,仅需要解决编译报错,可以修改调用代码,避免编译器错误匹配类型:
Class asdasd = NSClassFromString(@"Test"); if (asdasd) { id instance = [asdasd sharedInstance]; [instance performSelector:@selector(fetchCloudValues)]; }
内容的提问来源于stack exchange,提问作者Tiziano
相关产品推荐
相关产品推荐

