Swift 将 [UIn16] 转换为 UnsafeMutablePointer<UInt16>
Swift convert [UIn16] to UnsafeMutablePointer<UInt16>
我正在尝试将 UInt16
数组转换为 UnsafeMutablePointer<UInt16>
以便调用从 Swift.[=33 获取 uint16_t *
的 C 函数=]
如果我的起点是[UInt8]
,终点是UnsafeMutablePointer<UInt8>
,一切都会很简单。我可以将数组转换为 Data
,从那里转换为 NSData
,调用 bytes.assumingMemoryBound
,这样我就(几乎)完成了。
但是,对于手头的任务,我正在考虑几种不同的途径。一种方法是将 [UInt16]
转换为 [UInt8]
,采用与上述相同的数据路径,然后在 assumingMemoryBound
调用中指定不同的类型。
事实证明,这比预期的要复杂得多。关于如何将只有两个 UInt8
的数组转换为一个 UInt16
有很多问题;我发现 询问如何将单个 UInt16
转换为两个 UInt8
,但在转换数组时,这一切似乎变得更加复杂。
我正在尝试的另一种方法是简单地获取 [UInt16]
数组值并尝试使用中间 withUnsafeBytes
调用或类似的方法将其转换为 UnsafeMutablePointer<UInt16>
,但是 Swift 有一堆不同的指针类型,它们不匹配。具体来说,这是我早期的尝试之一:
array.withUnsafeBytes { (pointer: UnsafeRawBufferPointer) -> UnsafeMutablePointer<UInt16> in
let mutablePointer = UnsafeMutablePointer<UInt16>(mutating: pointer) // error
return mutablePointer
}
虽然会导致以下错误:
Cannot convert value of type 'UnsafeRawBufferPointer' to expected argument type '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
}
我正在尝试将 UInt16
数组转换为 UnsafeMutablePointer<UInt16>
以便调用从 Swift.[=33 获取 uint16_t *
的 C 函数=]
如果我的起点是[UInt8]
,终点是UnsafeMutablePointer<UInt8>
,一切都会很简单。我可以将数组转换为 Data
,从那里转换为 NSData
,调用 bytes.assumingMemoryBound
,这样我就(几乎)完成了。
但是,对于手头的任务,我正在考虑几种不同的途径。一种方法是将 [UInt16]
转换为 [UInt8]
,采用与上述相同的数据路径,然后在 assumingMemoryBound
调用中指定不同的类型。
事实证明,这比预期的要复杂得多。关于如何将只有两个 UInt8
的数组转换为一个 UInt16
有很多问题;我发现 UInt16
转换为两个 UInt8
,但在转换数组时,这一切似乎变得更加复杂。
我正在尝试的另一种方法是简单地获取 [UInt16]
数组值并尝试使用中间 withUnsafeBytes
调用或类似的方法将其转换为 UnsafeMutablePointer<UInt16>
,但是 Swift 有一堆不同的指针类型,它们不匹配。具体来说,这是我早期的尝试之一:
array.withUnsafeBytes { (pointer: UnsafeRawBufferPointer) -> UnsafeMutablePointer<UInt16> in
let mutablePointer = UnsafeMutablePointer<UInt16>(mutating: pointer) // error
return mutablePointer
}
虽然会导致以下错误:
Cannot convert value of type 'UnsafeRawBufferPointer' to expected argument type '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
}