数据与 [UInt8]

Data vs [UInt8]

Swift 提供 Data[UInt8] 类型,它们做的事情非常相似。

[UInt8] 本质上是一个字节数组,一个字节(我相信你知道)由 8 位组成。虽然 NSData 不仅仅是一个字节数组,但在深处它的底层结构是基于一个字节数组的。例如,您可以使用 data.bytes 等方法轻松地在它们之间进行转换。

在设计 API 方面,我个人建议您使用 NSData 来设计它们,因为它比简单的字节数组提供了所有额外的功能。 Apple 已经为您完成了很多工作,为什么还要自己再做一次?

大多数情况下我更喜欢使用 Data,但是 [UInt8] 有一个明显的优势:您可以将它直接传递给需要指向字节的指针的函数,例如 C 函数,而对于 Data 你必须做更多的体操。下面的代码演示了不可变数组和可变数组以及 Data 对象的区别。

func takesAPointer(_ p: UnsafePointer<UInt8>) {
    // ...
}

let a: [UInt8] = [1, 2, 3]
takesAPointer(a)
let d = Data([1, 2, 3])
d.withUnsafeBytes {
    let p = [=10=].bindMemory(to: UInt8.self).baseAddress!
    takesAPointer(p)
}

func takesAMutablePointer(_ p: UnsafeMutablePointer<UInt8>) {
    // ...
}

var b: [UInt8] = [1, 2, 3]
takesAMutablePointer(&b)
var e = Data([1, 2, 3])
e.withUnsafeMutableBytes {
    let p = [=10=].bindMemory(to: UInt8.self).baseAddress!
    takesAMutablePointer(p)
}