ObjC编译器提示协议中无setValue:方法,求问题排查
问题:调用ObjC协议方法时出现编译错误
我定义了如下ObjC协议:
#import <Foundation/Foundation.h> @protocol FutureObjC - (void)setValue: (NSObject *_Nullable)data NS_SWIFT_NAME(setValue(_:)); - (void)setError: (NSError *_Nullable*_Nullable)error NS_SWIFT_NAME(setError(_:)); @end
同时写了一个ObjCpp类方法,接收遵循该协议的对象:
- (void)__method:(_Nonnull id<FutureObjC>)future { [future setValue: nil]; }
但编译时报错,提示协议里找不到该方法:
/Users/ga.igumnov/work/sdk/build/x86_64/test/tests/test-sbis-djinni-static/src/async/djinni/objcpp/TestSBISDjinniAsync/DSAsyncTestInterface+Private.mm:94:13: error: instance method 'setValue:' not found ; did you mean 'getValue:'?
94 | [future setValue: nil];
| ^
请问我哪里错了?
解决方案
这个错误的核心原因是定义FutureObjC协议的头文件没有被正确导入到你的ObjCpp文件中,编译器看不到协议里的方法声明,所以报错。
你需要做的是:
- 在你的
.mm文件顶部,用#import导入包含FutureObjC协议的头文件。比如协议定义在FutureObjC.h里,就添加:#import "FutureObjC.h" - 确认头文件路径正确,编译时能被编译器找到,没有路径错误或者遗漏引用的情况。
- 排查是否存在命名冲突,比如有没有其他同名协议或方法干扰了当前声明。
只要确保协议声明被正确导入,编译器就能识别setValue:方法,解决这个编译错误。
内容的提问来源于stack exchange,提问作者Crazy Sage
相关产品推荐
相关产品推荐

