当前位置: 首页 > 面试题库 >

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

姬魁
2023-03-14
问题内容

我正在寻找在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



 类似资料:
  • 问题内容: 当我使用的方法时 我不知道如何转换 为和长度 如何迅速做到这一点? 问题答案: 您必须先将字符串转换为UTF-8数据 然后将其写入输出流 该转换是必要的,因为有型,而不是如预期的 方法。 Swift 3更新:

  • 问题内容: 我有不同长度的清单清单(例如),并想将其转换成整数数组。我了解多维数组中的“子”数组必须具有相同的长度。那么将上述示例中的列表转换成这样的数组(即用零完成)的最有效方法是什么? 问题答案: 您可以使用np.zeros创建一个numpy数组,并用列表元素填充它们,如下所示。 结果是

  • 所以我有: 其中包含x个数组列表,其中包含另一个y个字符串...演示: 其中index是指包含字符串的数组索引。 如何将其转换为2D数组,该数组如下所示: 非常感谢你。

  • 问题内容: 我有一本字典 我想将其转换为包含字典键的列表。每个密钥应重复与其关联值相同的次数。 我写了这段代码来完成这项工作: 输出: 但是我希望它能成为列表理解者。如何才能做到这一点? 问题答案: 您可以使用列表理解来做到这一点: 产量: 您可以再次对其进行排序以获得所需的列表。

  • 问题内容: 我要实现的是: 我怎样才能返回对象,而是如果? 问题答案: 我找到了解决方案。在结果上创建了扩展名。 并使用像

  • 我想要实现的是: 如果,我如何将对象返回为?