【问题标题】:Convert Data Object to array of structs将数据对象转换为结构数组
【发布时间】:2021-10-03 03:31:53
【问题描述】:

问题

如何使用最新的(swift 5)数据 API 将 Data() 对象转换为 Arraystructs

示例

在 Swift 5 之前,我有这段代码可以将 Data() 对象转换为 [Point] 数组

import Foundation

struct Point {
    let x: Float
    let y: Float
}

let pt1 = Point(x: 1, y: 1)
let pt2 = Point(x: 2, y: 2)

let points: [Point] = [pt1, pt2]

let pointData = Data(
    bytes: points,
    count: MemoryLayout<Point>.size * points.count
)

print(pointData.count)


var newPoints = [Point]()

// ** Deprecated **
pointData.withUnsafeBytes { (bytes: UnsafePointer<Point>) in
    newPoints = Array(UnsafeBufferPointer(start: bytes, count: pointData.count / MemoryLayout<Point>.size))
}

print(newPoints.count) // 2
print(newPoints[0])    // Point(x: 1.0, y: 1.0)
print(newPoints[1])    // Point(x: 2.0, y: 2.0)

withUnsafeBytes 现已弃用:

withUnsafeBytes' 已弃用:改用 withUnsafeBytes&lt;R&gt;(_: (UnsafeRawBufferPointer) throws -&gt; R) rethrows -&gt; R

但我不知道如何使用新的数据 API 将我的 pointData 转换为 [Point] 数组。


这是一个类似的answer,它适用于单个对象,但我很难将它应用到我的数组示例中。

【问题讨论】:

标签: arrays swift


【解决方案1】:

您现在应该使用新的withUnsafeBytes,它采用以UnsafeRawBufferPointer 作为参数的闭包。您现在不需要手动进行所有MemoryLayout 计算,只需将bind 内存直接转换为所需的类型即可。

pointData.withUnsafeBytes { rawBufferPointer in
    newPoints = Array(rawBufferPointer.bindMemory(to: Point.self))
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-15
    • 2018-03-10
    • 1970-01-01
    • 2016-04-19
    • 2020-04-20
    • 2022-01-09
    相关资源
    最近更新 更多