数据vs [UInt8]

时间:2016-10-05 11:55:29

标签: swift nsdata

Swift提供Data[UInt8]类型,它们的作用非常相似。

  • 两者之间有什么区别?
  • 在设计新API时,首选类型是什么?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

我更喜欢在大多数情况下使用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)
}