接收者类型 '' 例如 message 是前向声明(但 header 是在 .m 中导入的)

Receiver type '' for instance message is a forward declaration (but header is imported in .m)

我看过很多关于此的帖子,它通常似乎围绕着缺少 .h.m

中的导入

在我的例子中,我正在尝试导入 swift objective C 函数,但我相信 .h.mswift 文件配置正确(与生成的 swift-header 一样)。

我的 Swift class 被标记为 @objc 并扩展 NSObject.

当我使用前向声明在 .h 中导入 class,并在 .m 中使用 MyApp.h 导入时,它可以看到 class.但是,它看不到我想要的方法,它给我错误 Receiver type 'class' for instance message is a forward declaration.

当我检查生成的 header 文件时,该方法在那里生成(并且该方法被标记为 @objc 和 returns 一个 @objc 兼容值) .

您能否提出导致此问题的原因?

这是我的代码的参考:

Swift

@objc class ObjcHelper: NSObject {
    @objc static let shared = ObjcHelper()

    @objc public func getObjcFromNSString(nsString: NSString) -> ObjcType {
       return ObjcType()
    }
}

在 objective c 文件的 .h 中,我想在以下位置使用它:

@class ObjcHelper

并且在 .m 中我正在导入应用 header

#import <App-Swift.h>

当我尝试使用 .m 文件中的代码时,编译器可以很好地看到这部分:

[ObjcHelper shared] // 编译器认为这很好!

但是,如果我尝试调用该方法,它不会自动完成,即使我输入它也不会找到它。

如果我查看生成的 header,我会看到方法如下:

SWIFT_CLASS("_TtC7ObjcHelper")
@interface ObjcHelper : NSObject
SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) ObjcHelper * _Nonnull shared;)
+ (\ObjcHelper * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
- (enum ObjcType)getObjcFromNSStringWithNsString:(NSString * _Nonnull)nsString SWIFT_WARN_UNUSED_RESULT;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

我期望工作的代码如下(并产生错误):

ObjcType value = [[ObjcHelper shared] getObjcFromNSStringWithNsString: @"abc"]];

这个问题比较微妙,但似乎已经解决了。

在我的项目中有许多目标,对于 ObjcHelper 它没有针对其中一个目标。我相信发生的事情是,即使创建了桥接 objective c 帮助程序文件,但存在引用缺少 'required' 目标所有者的问题,并且此错误会向前传播,因为无法找到 class.

因此,如果您遇到此问题,请检查以确保您尝试引入 objective-c 的 Swift class 已将其目标成员资格设置为其所有目标需要(否则您可能会收到有关前向 class 声明的误导性错误)。