在 Swift 4 中将数据转换为 DispatchData

Convert Data to DispatchData in Swift 4

我正在将项目迁移到 Swift 4,但我无法弄清楚我应该如何使用新的 API:s 在 Swift 4 中执行此操作。以下代码是旧的 Swift 3 路(从函数的中间开始,因此是守卫):

let formattedString = "A string"
guard let stringData: Data = formattedString.data(using: .utf8) else { return }
let data: DispatchData = [UInt8](stringData).withUnsafeBufferPointer { (bufferPointer) in
    return DispatchData(bytes: bufferPointer)
}

现在它给出以下警告:init(bytes:)' is deprecated: Use init(bytes: UnsafeRawBufferPointer) instead

为此,您需要访问类型为 UnsafeRawBufferPointer 而不是 UnsafeBufferPointer<UInt8>

的变量

使用withUnsafeBytes得到一个UnsafeRawPointer到数据字节, 从该指针和计数创建一个 UnsafeRawBufferPointer, 并将其传递给 DispatchData 构造函数:

let formattedString = "A string"
let stringData = formattedString.data(using: .utf8)! // Cannot fail!

let data = stringData.withUnsafeBytes {
    DispatchData(bytes: UnsafeRawBufferPointer(start: [=10=], count: stringData.count))
}

或者,从字符串 UTF-8 视图创建一个数组,然后 使用 withUnsafeBytes 得到一个 UnsafeRawBufferPointer 表示数组连续元素存储:

let formattedString = "A string"
let data = Array(formattedString.utf8).withUnsafeBytes {
    DispatchData(bytes: [=11=])
}

以上所有的解决方案看起来很复杂,其实很简单:

let string = "str"
if let data = string.data(using: .utf8) {
  let dispatchData = data.withUnsafeBytes { DispatchData(bytes: [=10=]) }
}