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)
}