在我的示例项目中,我尝试使用桥接标头在 Swift 文件中使用 Objective-C 类和结构。我使用结构时遇到错误:
在范围内找不到类型“XXX”
但是,使用类没有任何错误。
我的 Objective-C 文件如下所示:
#import <Cocoa/Cocoa.h>
struct ObjCStruct {
NSMenu* sMenu;
int8_t menuID;
};
@interface ObjCClass : NSObject {
NSMenu* cMenu;
}
@end
在我的桥接标头中,我将其用作:
#import "ObjC.h"
最后,我在 Swift 文件中使用结构和类:
struct Model {
var c : ObjCClass;
var s : ObjCStruct;
}
如果
NSMenu* sMenu;
已从 ObjC.h 中注释掉,那么它就可以正常工作。
如何在 Swift 文件中使用 Objective-C 结构体?
我已在桥接标头中导入了 Objective-C 标头,并且桥接标头已在构建设置中正确引用。
将结构与对象一起使用对于内存管理来说非常棘手。 Objective-C 中的 struct 与 Swift 中的 struct 不同。您可以重新考虑将其声明为一个类。不过,我认为这是一个解决方法:
struct ObjCStruct {
__unsafe_unretained NSMenu* sMenu; //It's __strong by default
int8_t menuID;
};
在斯威夫特:
//Manage NSMenu manually by Unmanaged. Keep in mind to release this menu
//object later or you will get a leak here.
let menu: Unmanaged<NSMenu> = Unmanaged.passRetained(NSMenu(title: "2"))
let model = Model(c: .init(), s: .init(sMenu: menu, menuID: 2))
//To get the NSMenu
let menuUI = menu.takeRetainedValue()