将具有长度的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类型》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

UML用户指南

UML用户指南

[美] Grady Booch、James Rumbaugh、Ivar Jacobson / 邵维忠、麻志毅、马浩海、刘辉 / 人民邮电出版社 / 2006-6 / 49.00元

《UML用户指南》(第2版)是UML方面最权威的一本著作,三位作者是面向对象方法最早的倡导者,是UML的创始人。本版涵盖了UML 2.0。书中为具体的UML特征提供了参考,描述了一个使用UML进行开发的过程,旨在让读者掌握UML的术语、规则和语言特点,以及如何有效地使用这种语言,知道如何应用UML去解决一些常见的建模问题。《UML用户指南》(第2版)由7个部分组成,而且每章都描述了一个特定UML特......一起来看看 《UML用户指南》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具