如果我在头文件的struct中定义一个Objective-C id:

struct MyStruct {
    id field;
};
struct MyStruct *_Nonnull myFunction(void);

然后I #include将此标头放入桥接标头,然后try 从SWIFT端使用myFunction(),它将返回OpaquePointer.如果我try 直接返回MyStruct,它将错误地指出myFunction未定义.这仅在MyStruct包含对象-C id的情况下发生.

奇怪的是,如果我声明一个id类型的普通变量,它可以很好地移植到SWIFT.

为什么SWIFT拒绝包含Objective-C idstructs,我应该做些什么来规避这一点?

推荐答案

Swift can't handle strong references in structs.它不能插入所需的保留/释放.

你需要告诉SWIFT,它不需要通过将字段标记为__unsafe_unretained:

struct MyStruct {
    __unsafe_unretained id field;
};

这样,它将被正常导入,但field将是Unmanaged,这意味着您将需要根据需要自己处理内存管理.

请注意,如果此代码也从objc调用,则这也将更改其在那里的内存管理.正如线程中所讨论的,您可能需要判断__swift__定义,以判断编译该头文件的语言是什么.

Swift相关问答推荐

Swift UI在视图中排序不同的 struct

按变换zoom 在UIView中不起作用

将`@Environment`值赋给`Binding`参数

与视图交互使工具栏&;标题消失

在SwiftUI中绘制形状的路径后填充形状

如何隐藏集合视图中特定的单元格,以避免出现空白空间?

如何在 macOS/AppKit 的窗口选项卡上接受拖动项目的放置?

一组可散列的自定义元素插入相等的元素

在主要参与者中启动分离任务和调用非隔离函数之间的区别

SwiftUI View .tint(_ Color) 方法不起作用

当使用 CGFloat 而不是数字文字时,为什么 node 的位置会发生变化?

试图同时实现两个混合过渡

为什么 Swift Tuples 只能在元素个数小于等于 6 的情况下进行比较?

无法从自定义动态框架(Swift)访问类

将项目引用添加到 Swift iOS XCode 项目并调试

使用 swift 运行 pod install 时出错

如何实现 Swift 的 Comparable 协议?

使用 Swift 在 iOS 8 中为应用程序图标添加徽章

CMutablePointer - 如何访问它?

SwiftUI:将多个 BindableObjects 放入环境