【问题标题】:Swift convert [UIn16] to UnsafeMutablePointer<UInt16>Swift 将 [UIn16] 转换为 UnsafeMutablePointer<UInt16>
【发布时间】:2021-06-29 02:22:51
【问题描述】:

我正在尝试将 UInt16 数组转换为 UnsafeMutablePointer&lt;UInt16&gt; 以调用从 Swift 获取 uint16_t * 的 C 函数。

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

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

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

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

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

虽然会导致以下错误:

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

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

【问题讨论】:

    标签: c swift unsafemutablepointer uint16


    【解决方案1】:

    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
    }
    

    【讨论】:

    • 这行得通,谢谢!在我的具体情况下,数组是发生这种转换的方法的不可变参数,所以我改用withUnsafeBufferPointer
    猜你喜欢
    • 1970-01-01
    • 2018-10-21
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多