Включение протоколов ClassKit в проект Objective-C ++ - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь включить 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.

Любая помощь приветствуется.

...