将具有长度的UnsafePointer转换为Swift数组类型

我正在寻找在Swift中实现合理的C互操作性的最简单方法,而我当前的代码块是将UnsafePointer<Int8>(是const char

*)转换为[Int8]数组。

当前,我有一个幼稚的算法,可以采用UnsafePointer和一个字节,然后将其逐个元素转换为数组:

func convert(length: Int, data: UnsafePointer<Int8>) {

let buffer = UnsafeBufferPointer(start: data, count: length);

var arr: [Int8] = [Int8]()

for (var i = 0; i < length; i++) {

arr.append(buffer[i])

}

}

可以使用来加速循环本身arr.reserveCapacity(length),但是并不能消除循环本身的问题。

我知道这个SO问题涵盖了如何转换UnsafePointer<Int8>String,但是String完全是另一种野兽[T]。是否有一种方便的Swift方法将长度字节从中复制UnsafePointer<T>到中[T]?我更希望使用纯Swift方法,而不要通过NSData或类似方法。如果上述算法确实是唯一的方法,那么我很乐意坚持。

回答:

您可以简单地Array从初始化Swift UnsafeBufferPointer

func convert(length: Int, data: UnsafePointer<Int8>) -> [Int8] {

let buffer = UnsafeBufferPointer(start: data, count: length);

return Array(buffer)

}

这将创建所需大小的数组并复制数据。

或作为通用函数:

func convert<T>(count: Int, data: UnsafePointer<T>) -> [T] {

let buffer = UnsafeBufferPointer(start: data, count: count);

return Array(buffer)

}

指针指向length项目 数在哪里。

如果您有一个UInt8指针但想[T]从指向的数据创建一个数组,那么这是一个可能的解决方案:

// Swift 2:

func convert<T>(length: Int, data: UnsafePointer<UInt8>, _: T.Type) -> [T] {

let buffer = UnsafeBufferPointer<T>(start: UnsafePointer(data), count: length/strideof(T));

return Array(buffer)

}

// Swift 3:

func convert<T>(length: Int, data: UnsafePointer<UInt8>, _: T.Type) -> [T] {

let numItems = length/MemoryLayout<T>.stride

let buffer = data.withMemoryRebound(to: T.self, capacity: numItems) {

UnsafeBufferPointer(start: $0, count: numItems)

}

return Array(buffer)

}

其中length现在的数目 的字节 。例:

let arr  = convert(12, data: ptr, Float.self)

Float从指向的12个字节中创建一个3 s 的数组ptr

以上是 将具有长度的UnsafePointer转换为Swift数组类型 的全部内容, 来源链接: utcz.com/qa/400962.html

回到顶部