Swift 3中的SCNGeometryElement设置

时间:2016-11-30 21:57:12

标签: swift cocoa swift3 scenekit

我点了一下子弹并开始将我的应用程序转换为Swift 3.一如既往,转换器非常需要。在这种情况下,我不确定如何正确编码新版本。这是原始的:

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:)电话上):

  

'init'不可用:使用'withMemoryRebound(to:capacity:_)'暂时将内存视为另一种与布局兼容的类型。

我已经查看过这里的几个主题,并阅读了发布说明,并且我仍然感到困惑,我应该在这里做些什么。

1 个答案:

答案 0 :(得分:8)

你修复了一个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自动管理内存中的内存,推断数组的计数,并根据数组的计数和您指定的primitiveCount推断primitiveType

(注意,四个索引的数组是.triangles的一个不常见的数字;要么你有一个三角形和一个未使用的索引,要么实际上是指包含两个基元的.triangleStrip。)