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

栏目: Swift · 发布时间: 6年前

内容简介:http://stackoverflow.com/questions/32606989/converting-an-unsafepointer-with-length-to-a-swift-array-type
我正在寻找在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)来加速循环本身,但是这不会消除循环本身的问题.

我知道 this SO question 它涵盖了如何将UnsafePointer<Int8>转换为String,然而String是完全不同于[T]的不同的野兽.是否有一种方便的Swift方法从UnsafePointer<T>复制长度字节成为[T]?我更喜欢纯粹的Swift方法,而不需要通过NSData或类似的方法.如果上述算法真的是唯一的做法,我很乐意坚持下去.

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

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)

将从ptr指向的12个字节创建一个3个浮点数组.

http://stackoverflow.com/questions/32606989/converting-an-unsafepointer-with-length-to-a-swift-array-type


以上所述就是小编给大家介绍的《将具有长度的UnsafePointer转换为Swift Array类型》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Spring in Action

Spring in Action

Craig Walls / Manning Publications / 2011-6-29 / USD 49.99

Spring in Action, Third Edition has been completely revised to reflect the latest features, tools, practices Spring offers to java developers. It begins by introducing the core concepts of Spring and......一起来看看 《Spring in Action》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码