Mau*_*itz 2 cocoa scenekit swift swift3
我咬了一口子,开始将我的应用程序转换为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))
Run Code Online (Sandbox Code Playgroud)
在运行转换并编写新的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)
Run Code Online (Sandbox Code Playgroud)
但是,这给了我(Data(bytes:length:)随叫随到):
'init'不可用:使用'withMemoryRebound(to:capacity:_)'临时查看内存作为另一种布局兼容类型.
我在这里查看了几个主题,并阅读了发布说明,并且我仍然感到困惑,我应该在这里做些什么.
你修复了一个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)
Run Code Online (Sandbox Code Playgroud)
(另请注意修正以使其MemoryLayout与他们描述的数据保持一致.)
但是,除非您需要额外的Data对象,指针的乐趣,或者描述元素的额外特性,否则您可以使用更简单的形式:
let indices: [UInt8] = [0,1,2,3]
let element = SCNGeometryElement(indices: indices, primitiveType: .triangles)
Run Code Online (Sandbox Code Playgroud)
此通用初始化程序自动管理内存中的内存,推断数组的计数,并primitiveCount根据数组的数量和primitiveType您指定的内容推断.
(注意,四个索引的数组是一个不寻常的数字.triangles;要么你有一个三角形和一个未使用的索引,要么实际上意味着.triangleStrip包含两个基元.)
| 归档时间: |
|
| 查看次数: |
789 次 |
| 最近记录: |