【发布时间】:2019-09-25 16:26:51
【问题描述】:
这对你来说可能是微不足道的,但我是 Swift 的新手,我找不到答案。我使用 C 代码从 TCP/IP 转换数据,一切正常。但是当我尝试将数据发送回 Swift 时,我得到了错误: “UnsafeMutablePointer”类型的值没有成员“x” (在编译时)。
简单地说,我的 C 代码生成了一个结构,我希望我的 swift 代码可以读取该结构并使用一个结构来访问字段。 注意:我不想复制数据(这里的示例很简单,但我处理的是 MB(GB)。
override func viewDidLoad()
{
struct MyStruct1
{
var x : UInt32
var y : UInt32
}
var buffer : UnsafeMutablePointer<UInt8>?
//...
buffer = UnsafeMutablePointer<UInt8>.allocate( capacity: Int(1024) )
if (buffer != nil)
{
defer { buffer!.deallocate() }
// CCode_That_Initializes_Buffer( buffer ) with An array of MyStruct
var myStructP : UnsafeMutablePointer<MyStruct1>
myStructP = UnsafeMutableRawPointer(buffer!).assumingMemoryBound(to: MyStruct1.self)
// Value of type 'UnsafeMutablePointer<MyStruct1>' has no member 'x'
print( myStructP.x ) // <= This does not compile
}
}
【问题讨论】:
-
UnsafeMutablePointer.allocate(capacity)返回一个非可选值,因此您将buffer的前向声明为可选,对nil的检查以及之后的强制包装不会做任何事情。 -
对不起,我不明白。如果我删除“!”从缓冲区!编译器抱怨很多(大概是因为它是可选的;不是吗?)。或者也许我不明白可选这个词的用法。无论如何,如果没有您的代码示例,我不知道您的意思以及如何找到解决方案。谢谢你试图帮助我。我仍在寻求理解和修复我的代码...
-
我的评论不是解决方案(因此我没有把它作为答案放在下面),它只是对将
buffer声明为UnsafeMutablePointer<UInt8>?所引入的不必要的复杂性的评论。鉴于您将buffer设为可选,因此必须进行某种形式的展开(使用!强制展开是选项之一,尽管通常是最糟糕的选择),但如果只是将缓冲区设为非可选@,则可以完全避免这种情况。 987654329@ -
你从C地获得的数据背后的所有权模型是什么?谁负责解除分配? (例如,它是在保证它在您使用期间有效的情况下借给您的,然后在 C 端自动清理,或者您是否在适当的时候被赋予所有权和责任
free给你?) -
感谢 Alexander 提供的额外 cmets。我提供的代码不是我的真实代码,但它具有相同的结构。我需要一个缓冲区,可以根据来自 tcpip 的数据的需要重新分配和增长,如果设备内存不足,我需要释放它。 => 我需要的是帮助理解如何将缓冲区的指针提供给 Swift 以使用 Swift 结构访问生成的内存。我仍然不知道该怎么做。
标签: c swift pointers struct unsafemutablepointer