从 SceneKit 中提取顶点 iOS13 Swift 5

Extracting vertices from SceneKit iOS13 Swift 5

将我的代码更新为 iOS 13Swift 5,我有这个 弃用警告:

'withUnsafeBytes' is deprecated: use withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R instead

通过这段代码从 SCNGeometry 中提取顶点:

/// Extracts vertices from SCNGeometry
func vertices() -> [SCNVector3] {
    let vertexSources = self.sources(for: SCNGeometrySource.Semantic.vertex)
    if let vertexSource = vertexSources.first {
        let count = vertexSource.data.count / MemoryLayout<SCNVector3>.size
        return vertexSource.data.withUnsafeBytes {
             [SCNVector3](UnsafeBufferPointer<SCNVector3>(start: [=12=], count: count))
        }
    }
    return []
}

问题出在这几行中:

return vertexSource.data.withUnsafeBytes {
    [SCNVector3](UnsafeBufferPointer<SCNVector3>(start: [=13=], count: count))
}

This answer 在这里给出了解决方案,但是没有 Swift 5 代码,我无法针对警告提出解决方案。

and this thread 似乎给出了一个解决方案,但只有 UInt32 类型的值而不是 [SCNVector3] (array).

谢谢大家,我卡住了。

您可以通过将这些行替换为

来消除警告
return vertexSource.data.withUnsafeBytes { (buffer) in
    [SCNVector3](buffer.bindMemory(to: SCNVector3.self))
}

也就是说 此代码已损坏 。永远不要假设 SCNGeometySource 中包含的数据布局(例如假设直接映射到 SCNVector3)。 vectorCountfloatComponentscomponentsPerVectorbytesPerComponentdataOffsetdataStride 是正确检查 属性 来源所必需的。