加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:37:55 所属栏目:百科 来源:网络整理
导读:我正在寻找在Swift中实现合理的C互操作性的最简单的方法,而我目前的块正在转换UnsafePointer Int8 (这是一个const char *),成为一个[Int8]数组. 目前,我有一个天真的算法,可以采取UnsafePointer和多个字节,并将其转换为数组,逐个元素: func convert(length:
我正在寻找在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,_: 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个浮点数组.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读