从 SceneKit 中提取顶点 iOS13 Swift 5
Extracting vertices from SceneKit iOS13 Swift 5
将我的代码更新为 iOS 13 和 Swift 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
)。 vectorCount
、floatComponents
、componentsPerVector
、bytesPerComponent
、dataOffset
和 dataStride
是正确检查 属性 来源所必需的。
将我的代码更新为 iOS 13 和 Swift 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 代码,我无法针对警告提出解决方案。
UInt32
类型的值而不是 [SCNVector3]
(array).
谢谢大家,我卡住了。
您可以通过将这些行替换为
来消除警告return vertexSource.data.withUnsafeBytes { (buffer) in
[SCNVector3](buffer.bindMemory(to: SCNVector3.self))
}
也就是说 此代码已损坏 。永远不要假设 SCNGeometySource
中包含的数据布局(例如假设直接映射到 SCNVector3
)。 vectorCount
、floatComponents
、componentsPerVector
、bytesPerComponent
、dataOffset
和 dataStride
是正确检查 属性 来源所必需的。