Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Swift中将位数组转换为结构数组_Arrays_Swift_Struct - Fatal编程技术网

Arrays 在Swift中将位数组转换为结构数组

Arrays 在Swift中将位数组转换为结构数组,arrays,swift,struct,Arrays,Swift,Struct,这是我目前得到的。我想知道是否有一种更优雅的方法来实现这一点,或者更好的方法是,在不迭代整个结构的情况下,将数组转换为所需的类型 我的输入是一个包含像素数据的CFDataRef。我想把它转换成像素数组 struct Pixel { let r: UInt8 let g: UInt8 let b: UInt8 let a: UInt8 } var intArray = [UInt8](count: CFDataGetLength(data), repeatedVa

这是我目前得到的。我想知道是否有一种更优雅的方法来实现这一点,或者更好的方法是,在不迭代整个结构的情况下,将数组转换为所需的类型

我的输入是一个包含像素数据的
CFDataRef
。我想把它转换成像素数组

struct Pixel {
    let r: UInt8
    let g: UInt8
    let b: UInt8
    let a: UInt8
}

var intArray = [UInt8](count: CFDataGetLength(data), repeatedValue: 0)
let dataRange = CFRangeMake(0, CFDataGetLength(data))
CFDataGetBytes(data, dataRange, &intArray)

var pixelArray : [Pixel] = []
for var i = 0; i < intArray.count; i += 4 {
    let p = Pixel(r: intArray[i], g: intArray[i+1], b: intArray[i+2], a: intArray[i+3])
    pixelArray.append(p)
}
struct像素{
让r:UInt8
让g:UInt8
b:UInt8
a:UInt8
}
var intArray=[UInt8](计数:CFDataGetLength(数据),repeatedValue:0)
让dataRange=CFRangeMake(0,CFDataGetLength(数据))
CFDataGetBytes(数据、数据范围和数组)
var pixelArray:[像素]=[]
对于var i=0;i
多亏@GoZoner的提示,我在Apple DevForums上找到了它。下面是我最后的工作解决方案

struct Pixel {
    let r: UInt8
    let g: UInt8
    let b: UInt8
    let a: UInt8
}

let data: CFData! = ...
let width: Int = ...
let height: Int = ...

let pixelPtr = UnsafePointer<Pixel>(CFDataGetBytePtr(data))
let pixelBuf = UnsafeBufferPointer<Pixel>(start: pixelPtr, count:width*height)
struct像素{
让r:UInt8
让g:UInt8
b:UInt8
a:UInt8
}
让数据:CFData!=。。。
让宽度:Int=。。。
让高度:Int=。。。
设pixelPtr=UnsafePointer(CFDataGetBytePtr(data))
让pixelBuf=UnsafeBufferPointer(开始:pixelPtr,计数:宽度*高度)

我想对于Swift 3及其后版本,解决方案需要更新如下:

let pixelPtr0 = UnsafePointer<UInt8>(CFDataGetBytePtr(data))
let pixelPtr = UnsafeRawPointer(pixelPtr0)?.bindMemory(to: Pixel.self, capacity: 1)
let pixelBuf = UnsafeBufferPointer<Pixel>(start: pixelPtr, count:width*height)
let pixelPtr0=UnsafePointer(CFDataGetBytePtr(data))
设pixelPtr=UnsafeRawPointer(pixelPtr0)?.bindMemory(to:Pixel.self,容量:1)
让pixelBuf=UnsafeBufferPointer(开始:pixelPtr,计数:宽度*高度)

它适合我。

您可以查看覆盖在intArray上的UnsafeBufferPointer。细节由你决定。