-1

这对你来说可能是微不足道的,但我是 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
  }
}
4

1 回答 1

1

您不能将分配为不安全原始指针的缓冲区映射到 Swift 结构变量而不进行复制。

Swift 结构变量具有其他语言属性,因此您只能通过指针访问 Swift 结构变量的内容,前提是该变量已被 Swift 分配为相同的结构类型(例如,不是 C 传递给它的不安全指针) .

相反,您可以编写访问器函数,使用每个 Swift 结构元素的偏移量和大小从绑定到所需类型变量的偏移量原始指针读取和写入字节。

或者只是通过桥接头使用 C 结构。

于 2019-05-08T19:08:09.590 回答