2

假设我有一个名为ExampleClass.

假设我然后编写这样的代码:

@objc class ExampleClass: NSObject {}

像这样的 ObjectiveC 文件头:

#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>

@interface RCT_EXTERN_MODULE(ExampleClass, NSObject)
@end

然后我在我的 React Native 应用程序中使用它,如下所示: console.log('exampleClass', React.NativeModules.ExampleClass);

现在编译react-native run-ios产生以下异常:

❌  Undefined symbols for architecture x86_64
> Symbol: `_OBJC_CLASS_$_ExampleClass`
> Referenced from: `l_OBJC_$_CATEGORY_ExampleClass_$_RCTExternModule in ExampleClass-2517576D7E90370.o



❌  ld: symbol(s) not found for architecture x86_64



❌  clang: error: linker command failed with exit code 1 (use -v to see invocation)


** BUILD FAILED **

仅更改 swift 使其显示为:

@objc(ExampleClass)
class ExampleClass: NSObject {}

结果编译成功。这两种语法有什么区别?为什么后者有效而前者无效?

4

1 回答 1

2

@objc属性的参数指定 Swift 将导出到 Objective C 的名称。

在 Objective-C 中配置 Swift 接口

在某些情况下,您需要更精细地控制 Swift API 如何向 Objective-C 公开。您可以使用该@objc(name)特性来更改接口中的类、属性、方法、枚举类型或枚举案例声明的名称,因为它公开给 Objective-C 代码。

例如,如果您的 Swift 类的名称包含一个 Objective-C 不支持的字符,您可以提供一个替代名称以在 Objective-C 中使用。如果您为 Swift 函数提供 Objective-C 名称,请使用 Objective-C 选择器语法。:请记住在选择器后面的参数处添加冒号 ( )。

使用 Swift 与 Cocoa 和 Objective-C (Swift 4.1) > Swift 类型兼容性 > 在 Objective-C 中配置 Swift 接口

于 2018-05-02T18:58:11.373 回答