我希望能够找到最简单的方法,在Swift中实现合理的C互操作性。目前,我的难点是将一个UnsafePointer(它是一个const char *)转换为[Int8]数组。
目前,我有一个天真的算法,可以接受一个UnsafePointer和一定数量的字节,并逐个元素地将其转换为数组:
目前,我有一个天真的算法,可以接受一个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中,是否有方便的方法可以将长度为length
字节从UnsafePointer<T>
中复制到[T]
中?我更喜欢纯Swift方法,而不是通过NSData
或类似方法进行处理。如果上述算法确实是唯一的方法,那么我愿意坚持使用它。
UnsafeBufferPointer
只是一个指针,它不会分配内存,因此没有什么需要释放的。然后,Array
由Swift管理。 - Martin Rlet buffer
行应该是let buffer = data.withMemoryRebound(to: T.self, capacity: 1) {UnsafeBufferPointer(start: $0, count: length/MemoryLayout<T>.stride)}
。 - kabiroberaicapacity
需要是项目数量吗?即使将容量设置为1(因为$0
只引用开始而不是整个数据),它似乎也能正常工作。 - kabiroberai