Swift 3中的SCNGeometryElement设置

问题描述:

我咬紧牙关,开始将我的应用程序转换为Swift 3.与往常一样,转换器还有很多不足之处。在这种情况下,我不确定如何正确编码新版本。以下是原文:Swift 3中的SCNGeometryElement设置

let indexes : [CInt] = [0,1,2,3] 
let dat = NSData(bytes: indexes, length: sizeofValue(indexes)) 
let ele = SCNGeometryElement(data:dat, primitiveType: .Triangles, primitiveCount: 2, bytesPerIndex: sizeof(Int)) 

运行转换并写入新的sizeof(感谢)后,我结束了这一点:

let indexes : [CInt] = [0,1,2,3] 
let dat = Data(bytes: UnsafePointer<UInt8>(indexes), count: sizeof(indexes)) 
let ele = SCNGeometryElement(data:dat, primitiveType: .triangles, primitiveCount: 2, bytesPerIndex: MemoryLayout<Int>.size) 

然而,这给了我(在Data(bytes:length:)调用):

“初始化”是不可用:使用“withMemoryRebound(到:容量:_)”到临时查看存储器作为另一布局兼容型。

我已经在这里看过几个主题,并阅读了发布说明,涵盖了这一点,而且我仍然对这里应该做的事情感到困惑。

您修复了一个sizeof而不是另一个,并且您正在创建一个新指针,因为这是不必要的 - 任何数组(如果给出正确的元素类型)都可以传递给采用C风格指针的API。为您的代码直接修复则是:

let indexes: [CInt] = [0,1,2,3] 
let dat = Data(bytes: indexes, count: MemoryLayout<CInt>.size * indexes.count) 
let ele = SCNGeometryElement(data:dat, primitiveType: .triangles, primitiveCount: 2, bytesPerIndex: MemoryLayout<CInt>.size) 

(还要注意的修补程序,让您的MemoryLayout一贯与它们所描述的数据。)

但是,除非你有一些需要额外Data对象,与指针的乐趣,或者在描述你的元素额外的特殊性,您可以用简单的形式:

let indices: [UInt8] = [0,1,2,3] 
let element = SCNGeometryElement(indices: indices, primitiveType: .triangles) 

This generic initializer自动管理上的方式存储,推断阵列的数量,一个d根据您指定的阵列的数量和primitiveType推断primitiveCount

(请注意,四个索引的阵列为.triangles一个不寻常的数目;或者你有一个三角形和一个未使用的索引,或者实际上意味着包含两个基元.triangleStrip。)

+0

这是一个极好的答案,作为总是,rickter。我非常感谢简化。具有讽刺意味的是,原来的三线版本来自苹果自己的例子。 –

+0

更老的例子,可能永远不会更新。我发现当你[对开发者文档提出错误文档](http://bugreport.apple.com)时,他们经常会做出快速修复。 – rickster