Data vs [UInt8]



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

  • 两者有何不同?
  • 在设计新的API时,首选的类型是什么?

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

在设计api方面,我个人建议你用NSData来设计它们,因为它提供了一个简单字节数组的所有额外功能。苹果已经为你做了很多跑腿的工作,为什么还要自己再做一次呢?

我更喜欢在大多数情况下使用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 = $0.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 = $0.bindMemory(to: UInt8.self).baseAddress!
    takesAMutablePointer(p)
}

最新更新