微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift 将 [UIn16] 转换为 UnsafeMutablePointer<UInt16>

如何解决Swift 将 [UIn16] 转换为 UnsafeMutablePointer<UInt16>

我正在尝试将 UInt16 数组转换为 UnsafeMutablePointer<UInt16>,以便调用从 Swift 获取 uint16_t * 的 C 函数

如果我的起点是 [UInt8],我的目的地是 UnsafeMutablePointer<UInt8>,一切都会很简单。我可以将数组转换为 Data,从那里转换为 NSData调用 bytes.assumingMemoryBound,这样我就(几乎)完成了。

但是,对于手头的任务,我正在考虑几种不同的路径。一种方法是将 [UInt16] 转换为 [UInt8],采用与上述相同的数据路径,然后在 assumingMemoryBound 调用中指定不同的类型。

事实证明,这比预期的要复杂得多。关于如何将只有两个 UInt8 的数组转换为一个 UInt16; 的问题有很多。我发现 one question 询问如何将单个 UInt16 转换为两个 UInt8,但在转换数组时似乎涉及更多。

我尝试的另一种方法是简单地获取 [UInt16] 数组值并尝试使用中间 UnsafeMutablePointer<UInt16> 调用或类似方法将其转换为 withUnsafeBytes,但 Swift有一堆不同的指针类型,只是不匹配。具体来说,这是我之前的尝试之一:

array.withUnsafeBytes { (pointer: UnsafeRawBufferPointer) -> UnsafeMutablePointer<UInt16> in
    let mutablePointer = UnsafeMutablePointer<UInt16>(mutating: pointer) // error
    return mutablePointer
}

虽然会导致以下错误

无法将“UnsafeRawBufferPointer”类型的值转换为预期的参数类型“UnsafePointer”

也许我还没有找到正确的问题或正确的文档页面,所以我很感激任何指向正确方向的指示!

解决方法

withXXXBytes 方法为您提供原始指针,但在这里您需要一个类型化的指针。改用 withUnsafeMutableBufferPointer 并获取基地址:

arrayOfUInt16.withUnsafeMutableBufferPointer { (bufferPointer) in
    let mutablePointerOfUInt16 = bufferPointer.baseAddress
    // do whatever you want with mutablePointerOfUInt16
    // just don't "store or return the pointer for later use." as the documentation says 
    // because the pointer is only valid within this block
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。