【问题标题】:Data vs [UInt8]数据与 [UInt8]
【发布时间】:2020-09-20 14:15:12
【问题描述】:

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

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

【问题讨论】:

  • 我会说Data (~NSData) 是对象并提供了很多有用的方法。但这取决于您是否需要它们。

标签: swift nsdata


【解决方案1】:

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

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

【讨论】:

  • 是我们鼓励使用Data 还是仅仅与ObjC 部件交互?你有使用 Data[UInt8] 的流行库吗?
  • 不使用 ObjC 部件的 Linux 应用怎么办? Data 对那些人来说很受欢迎吗?
  • NSData 只是 iOS/OSX 表示二进制数据的方式。应用程序和后端之间实际交换的数据通常是 base64 编码的字符串。 NSData 可以使用data.base64EncodedStringWithEncoding(NSUTF8StringEncoding) 轻松转换为
  • 对我来说听起来不错!我不知道 Foundation 在 Linux 上可用。嘿,每天都学点新东西……
  • 看起来苹果已经齐心协力从[UInt8]切换到Data,至少在Swift Protobuf项目中:github.com/apple/swift-protobuf/issues/129github.com/apple/swift-protobuf/pull/134
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2017-03-24
    • 2023-03-06
    相关资源
    最近更新 更多