数据与 [UInt8]
Data vs [UInt8]
Swift 提供 Data
和 [UInt8]
类型,它们做的事情非常相似。
- 两者有什么区别?
- 设计新的 API 时,首选类型是什么?
[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)
}
Swift 提供 Data
和 [UInt8]
类型,它们做的事情非常相似。
- 两者有什么区别?
- 设计新的 API 时,首选类型是什么?
[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)
}