Swift提供Data
和[UInt8]
类型,它们的作用非常相似。
答案 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)
}