在Swift中使用C++结构时出错(在作用域中找不到类型'XXX')

qnakjoqk  于 2024-01-05  发布在  Swift
关注(0)|答案(1)|浏览(152)

在我的示例项目中,我尝试在Swift文件中使用桥接头文件来使用C-C类和结构体。我在使用结构体时得到一个错误:
在作用域中找不到类型“XXX”
但是,类的使用没有任何错误。
我的xml-c文件看起来像:

  1. #import <Cocoa/Cocoa.h>
  2. struct ObjCStruct {
  3. NSMenu* sMenu;
  4. int8_t menuID;
  5. };
  6. @interface ObjCClass : NSObject {
  7. NSMenu* cMenu;
  8. }
  9. @end

字符串
在我的桥接头中,我将其用作:

  1. #import "ObjC.h"


最后,我在Swift文件中使用了struct和classes:

  1. struct Model {
  2. var c : ObjCClass;
  3. var s : ObjCStruct;
  4. }


如果NSMenu* sMenu;已经从ObjC. h中注解掉,那么它可以正常工作。
我如何在Swift文件中使用C2C结构体?
我已经在桥接头文件中导入了C2C-C头文件,并且桥接头文件在构建设置中已被正确引用。

5q4ezhmt

5q4ezhmt1#

将struct与对象一起使用对于内存管理来说是非常棘手的。Objective-c中的Struct与Swift中的struct不一样。你可以重新考虑将其声明为一个类。然而,我认为这是一个解决方案:

  1. struct ObjCStruct {
  2. __unsafe_unretained NSMenu* sMenu; //It's __strong by default
  3. int8_t menuID;
  4. };

字符串
在Swift中:

  1. //Manage NSMenu manually by Unmanaged. Keep in mind to release this menu
  2. //object later or you will get a leak here.
  3. let menu: Unmanaged<NSMenu> = Unmanaged.passRetained(NSMenu(title: "2"))
  4. let model = Model(c: .init(), s: .init(sMenu: menu, menuID: 2))
  1. //To get the NSMenu
  2. let menuUI = menu.takeRetainedValue()

的数据

展开查看全部

相关问题