在 Swift 中使用 Objective-C 结构时出错(无法在范围内找到类型“XXX”)

问题描述 投票:0回答:1

在我的示例项目中,我尝试使用桥接标头在 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 标头,并且桥接标头已在构建设置中正确引用。

swift objective-c struct bridging-header
1个回答
2
投票

将结构与对象一起使用对于内存管理来说非常棘手。 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()
© www.soinside.com 2019 - 2024. All rights reserved.