关于classname与类本身的@objc注释

时间:2018-05-02 16:36:44

标签: objective-c swift react-native objective-c-swift-bridge

假设我有一个名为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 {}

导致编译成功。这两种语法有什么区别?为什么后者工作而前者不工作?

1 个答案:

答案 0 :(得分:1)

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

  

在Objective-C中配置Swift接口

     

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

     

例如,如果Swift类的名称包含Objective-C不支持的字符,则可以提供替代方法   在Objective-C中使用的名称。如果为a提供Objective-C名称   Swift函数,使用Objective-C选择器语法。记得添加一个   冒号(:)只要参数跟在选择器块之后。

来自Using Swift with Cocoa and Objective-C (Swift 4.1) > Swift Type Compatibility > Configuring Swift Interfaces in Objective-C