@objc аннотация на имя класса против самого класса - PullRequest
0 голосов
/ 02 мая 2018

Скажем, у меня есть класс под названием 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 голосов
/ 02 мая 2018

Параметр этого атрибута @objc указывает имя, которое Swift будет экспортировать в Objective C.

Настройка интерфейсов Swift в Objective-C

В некоторых случаях вам необходим более точный контроль над тем, как ваш Swift API подвергается воздействию Objective-C. Вы можете использовать атрибут @objc(name) изменить имя класса, свойства, метод, тип перечисления или объявление регистрационного регистра в вашем интерфейсе Код Objective-C.

Например, если имя вашего класса Swift содержит символ, который не поддерживается Objective-C, вы можете предоставить альтернативу имя для использования в Objective-C. Если вы предоставляете имя Objective C для Функция Swift, используйте синтаксис селектора Objective-C. Не забудьте добавить двоеточие (:) везде, где параметр следует за фрагментом селектора.

С Использование Swift с Какао и Objective-C (Swift 4.1)> Совместимость типов Swift> Настройка интерфейсов Swift в Objective-C

...