如果我在头文件中的struct
中定义Objective-Cid
:
struct MyStruct {
id field;
};
struct MyStruct *_Nonnull myFunction(void);
然后我将#include
这个头放入桥接头中,然后尝试使用Swift侧的myFunction()
,它将返回OpaquePointer
。如果我尝试直接返回MyStruct
,它会错误地说myFunction
没有定义。只有当MyStruct
包含Objective-Cid
时才会发生这种情况。
奇怪的是,如果我声明一个类型为id
的普通变量,它可以很好地移植到Swift。
Swift为什么拒绝包含Objective-Cid
s的structs?我应该怎么做才能避免这种情况?
您需要通过标记字段__unsafe_unretained
:来告诉Swift它不必这样做
struct MyStruct {
__unsafe_unretained id field;
};
这样,它将正常导入,但field
将是Unmanaged
,这意味着您需要根据需要自己处理内存管理。
注意,如果这个代码也是从ObjC调用的,那么这也会改变它在那里的内存管理。正如线程中所讨论的,您可能需要检查__swift__
定义,以检查编译此标头的语言。