假设我有一个名为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 {}
导致编译成功。这两种语法有什么区别?为什么后者工作而前者不工作?
答案 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选择器语法。记得添加一个 冒号(
:
)只要参数跟在选择器块之后。