我正在尝试将适用于Apple的Classroom Manager的ClassKit集成到Xcode 10.0和ios 11.4下的现有Objective-C ++应用程序中,并且遇到了Xcode生成的快速桥接头MyProject-Swift.h的麻烦,无法识别ClassKit协议,CLSDataStoreDelegate。
CLSDtaStoreDelegate继承自NSObjectProtocol,据文档说,它是所有Objective-C对象的基础,并以名称NSObjectProtocol导入到Swift中。 (尚不清楚“导入到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是: “ AppDelegate.mm包含的文件中没有名为'CLSDataStoreDelegate'MyProject-Swift.h的类型或协议”。
列出了其他帖子,在协议声明中添加了“ @objc”,但是CLSDataStoreDelegate是ClassKit的一部分,我无权访问。我尝试将其子类化,但这没用。
看来,桥接头文件包含所有Swift类,即使它们没有“ @objc”属性或函数,也可以通过dummySwiftClass和其他未列出的类来证明。尝试分隔Swift文件可能是一个问题。我还发现桥接头无法识别swift文件中的结构和枚举。
如果从MenuLibrary中删除了“ CLSDataStoreDelegate”,则可以从Objective-C ++ .mm文件访问Swift类中的属性和函数,但是如果我要将ClassKit与Objective-C ++文件一起使用,则委托是必需的。看来ClassKit是在设计时考虑到纯Swift项目的,但是将我的应用程序完全转换为Swift却是禁止的。
任何帮助将不胜感激。