有很多关于这个问题的参考资料,但似乎没有一个有效。我使用Xcode 14.1。我做错了什么?
在struct中有一个C缓冲区:
struct MY_C_STRUCT
{
char buff[256]; //Contains null-terminated C-string in UTF-8 encoding
};
,我有一个Swift结构体,我试图从MY_C_STRUCT::buff
设置它的变量:
class MyStruct : ObservableObject
{
@Published public var Buff : String = ""
func from_MY_C_STRUCT(mi : MY_C_STRUCT)
{
Buff = String(cString: mi.buff)
}
}
这给了我在String(cString:)
行:
调用初始化式时没有精确匹配
正如这篇博客所解释的,Swift导入固定大小的C数组作为元组!
将元组视为缓冲区的一种方法是使用withUnsafeBytes
获得指向内存的指针,然后将该指针传递给String(cString:)
:
替换:
Buff = String(cString: mi.buff)
:
Buff = withUnsafeBytes(of: mi.buff) { (rawPtr) -> String in
let ptr = rawPtr.baseAddress!.assumingMemoryBound(to: CChar.self)
return String(cString: ptr)
}