Arrays 将数组变量转换为Swift中的数据

Arrays 将数组变量转换为Swift中的数据,arrays,swift,nsdata,uint,Arrays,Swift,Nsdata,Uint,我想(至少我认为)将UInt8值数组转换为数据 在这里使用数据(字节:变量)不起作用 以下是变量的类型: po type(of: obj.variable) (Swift.UInt8, Swift.UInt8, Swift.UInt8, Swift.UInt8) 这似乎不是UInt8的数组,但它是什么类型的,如何将其转换为数据 谢谢 obj的类型是由四个UInt8值组成的元组 您可以按如下方式访问元组的元素: let obj: (UInt8, UInt8, UInt8, UInt8) =

我想(至少我认为)将UInt8值数组转换为数据

在这里使用数据(字节:变量)不起作用

以下是变量的类型:

po type(of: obj.variable)   
(Swift.UInt8, Swift.UInt8, Swift.UInt8, Swift.UInt8)
这似乎不是UInt8的数组,但它是什么类型的,如何将其转换为数据


谢谢

obj的类型是由四个
UInt8
值组成的元组

您可以按如下方式访问元组的元素:

let obj: (UInt8, UInt8, UInt8, UInt8) = (2, 4, 6, 8) // let obj be a tuple of four UInt8 values
obj.0  // 2
obj.1  // 4
由于
数据
实际上是字节的
集合
,因此可以从
UInt8
值序列初始化它

因此,最简单的解决方案就是从元组的元素创建一个
数组
,并从中初始化一个
数据
值:

let data = Data([obj.0, obj.1, obj.2, obj.3])
let data = withUnsafePointer(to: &obj) { ptr -> Data in
    return Data(bytes: ptr, count: MemoryLayout.size(ofValue: obj)
}
但是,这不是最通用的解决方案,仅当元组仅包含
UInt8
值时才有效

更通用的方法是首先将元组转换为
UnsafePointer
,然后从中创建
Data
值:

let data = Data([obj.0, obj.1, obj.2, obj.3])
let data = withUnsafePointer(to: &obj) { ptr -> Data in
    return Data(bytes: ptr, count: MemoryLayout.size(ofValue: obj)
}

看起来像一个有4个
UInt8
值的元组。太棒了!的确谢谢