接收者类型 '' 例如 message 是前向声明(但 header 是在 .m 中导入的)
Receiver type '' for instance message is a forward declaration (but header is imported in .m)
我看过很多关于此的帖子,它通常似乎围绕着缺少 .h
或 .m
中的导入
在我的例子中,我正在尝试导入 swift objective C 函数,但我相信 .h
、.m
和 swift
文件配置正确(与生成的 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 声明的误导性错误)。
我看过很多关于此的帖子,它通常似乎围绕着缺少 .h
或 .m
在我的例子中,我正在尝试导入 swift objective C 函数,但我相信 .h
、.m
和 swift
文件配置正确(与生成的 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 声明的误导性错误)。