Я пытаюсь включить ClassKit для Apple Classroom Manager в существующие приложения Objective-C++ в Xcode 10.0 и ios 11.4, и у меня возникают проблемы с заголовком быстрого соединения, созданным Xcode, 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")
}
}
Если соединительный заголовок импортируется в файл .mm цели-C++, возникает ошибка, даже если файл .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. Я также обнаружил, что заголовок моста не распознает структуры и перечисления в быстрых файлах.
Если «CLSDataStoreDelegate» удален из MenuLibrary, я могу получить доступ к свойствам и функциям в классах Swift из файлов Objective-C++ .mm, но делегат необходим, если я буду использовать ClassKit с файлами Objective-C++. Похоже, что ClassKit был разработан с учетом проектов на чистом Swift, но было бы непозволительно полностью переводить мои приложения на Swift.
Любая помощь будет оценена по достоинству.
Это сработало. Спасибо! Это потому, что ClassKit написан на C или C++? Я не включил все файлы Objective-C++ и просто тестирую конец ClassKit, но пока все хорошо.
Если вы хотите иметь доступ к классам модуля, вам необходимо импортировать модуль. Это почти все, что нужно сделать, независимо от языка файла, в который вы выполняете импорт.





Пробовали ли вы импортировать
ClassKitв файл.mmперед импортом"MyProject-Swift.h"?