内容简介:http://stackoverflow.com/questions/32606989/converting-an-unsafepointer-with-length-to-a-swift-array-type
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类型》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- memcached对key和value的限制 memcached的key最大长度和Value最大长度
- protobuf可变长度原理
- Haskell长度图说明?
- perl – 截断stdin行长度?
- 聊一聊CSS中的长度单位
- 掌握web开发基础系列--长度单位
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
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》 这本书的介绍吧!