Свифт немного искажает названия, даже когда это не похоже на это. Когда вы делаете что-то вроде ссылки на имя класса через строку, как в info.plist
расширения FinderSync, это не всегда работает так, как задумано в Swift.
Например, если у вас есть такой класс:
@objc
class MyFinderSyncPrinicpalClass: FIFinderSync {
// ...
}
попробуйте скомпилировать это и посмотреть на сгенерированный заголовок Obj-C. Вероятно, это выглядит примерно так:
SWIFT_CLASS("_TtC17My_Finder_Sync10MyFinderSyncPrinicpalClass")
@interface MyFinderSyncPrinicpalClass : FIFinderSync
// ...
@end
Это означает, что код Swift и Objective-C могут просто ссылаться на него как MyFinderSyncPrinicpalClass
, но все, что хочет ссылаться на его скомпилированную форму через строку, например, в отражении или в том, что info.plist
, видит, что искалечено имя _TtC17My_Finder_Sync10MyFinderSyncPrinicpalClass
. Чтобы это исправить, просто укажите имя явно в аннотации @objc
:
@objc(MyFinderSyncPrinicpalClass)
class MyFinderSyncPrinicpalClass: FIFinderSync {
// ...
}
Теперь, если вы сравните это с недавно сгенерированным заголовком Obj-C , вы поймете, что я имею в виду:
SWIFT_CLASS("MyFinderSyncPrinicpalClass")
@interface MyFinderSyncPrinicpalClass : FIFinderSync
// ...
@end
Теперь вы можете ссылаться на него по его фактическому названию в info.plist
, и он будет запущен как положено!