Я пытаюсь включить ClassKit для Classroom Manager от Apple в существующие приложения Objective-C ++ под Xcode 10.0 и ios 11.4, и у меня возникают проблемы с генерируемым Xcode заголовком swift bridging, MyProject-Swift.h, не распознающим протокол ClassKit, CLSDataStoreDelegate.
CLSDtaStoreDelegate наследуется от NSObjectProtocol, который, как говорится в документации, является фундаментальным для всех объектов Objective-C и импортируется в Swift с именем NSObjectProtocol.(Непонятно, что означает «импортированный в Swift» - он делает быструю версию протокола Objective-C с тем же именем?)
CLSDataStoreDelegate объявлен в файле Swift, MenuLibrary.swift:
@objcMembers
class MenuLibrary : NSObject, CLSDataStoreDelegate
{
@objc
static var mShared = MenuLibrary()
@objc
var mArrMainTopics : [MainTopic] = []
override init()
{
super.init()
}
...
}
class dummySwiftClass : NSObject
{
required init (coder aDecoder : NSCoder)
{
fatalError ("init (coder:) has not been implemented")
}
}
Если заголовок моста импортируется в файл Objective-C ++ .mm, возникает ошибка, даже если файл .mm не имеет быстрого кода.
// AppDelegate.mm
#import "MyProject-Swift.h"
Соответствующие результаты в сгенерированном xcode заголовке моста Swift:
@class CLSContext;
SWIFT_CLASS("_TtC15ObjectiveC_Test11MenuLibrary")
@interface MenuLibrary : NSObject <CLSDataStoreDelegate>
SWIFT_CLASS_PROPERTY(@property (nonatomic, class, strong) MenuLibrary * _Nonnull mShared;)
+ (MenuLibrary * _Nonnull)mShared SWIFT_WARN_UNUSED_RESULT;
+ (void)setMShared:(MenuLibrary * _Nonnull)value;
@property (nonatomic, copy) NSArray<MainTopic *> * _Nonnull mArrMainTopics;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
- (CLSContext * _Nullable)createContextForIdentifier:(NSString * _Nonnull)identifier parentContext:(CLSContext * _Nonnull)parentContext parentIdentifierPath:(NSArray<NSString *> * _Nonnull)parentIdentifierPath SWIFT_WARN_UNUSED_RESULT;
@end
SWIFT_CLASS("_TtC15ObjectiveC_Test15dummySwiftClass")
@interface dummySwiftClass : NSObject
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_DEPRECATED_MSG("-init is unavailable");
@end
Ошибка возникает в четвертой строке, где CLSDataStoreDelegate: «Нет типа или протокола с именем» CLSDataStoreDelegate«MyProject-Swift.h в файле, включенном из AppDelegate.mm».
В других сообщениях добавлено «@objc» к объявлению протокола, но CLSDataStoreDelegate является частью ClassKit, к которому у меня нет доступа.Я попытался создать его подклассы, но это не сработало.
Похоже, что заголовок моста включает все классы Swift, даже если у них нет свойств или функций "@objc", о чем свидетельствует dummySwiftClass и другие классы, не имеющиев списке.Это может быть проблемой при попытке разделения файлов Swift.Я также обнаружил, что соединительный заголовок не распознает структуры и перечисления в файлах swift.
Если «CLSDataStoreDelegate» удален из MenuLibrary, я могу получить доступ к свойствам и функциям в классах Swift из Objective-C ++ .mmфайлы, но делегат необходим, если я хочу использовать ClassKit с файлами Objective-C ++.Похоже, что ClassKit был разработан с учетом чистых проектов Swift, но было бы непозволительно полностью переводить мои приложения в Swift.
Любая помощь приветствуется.