我忍无可忍,开始将我的应用程序转换为Swift3。与往常一样,转换器有很多不足之处。在这种情况下,我不确定如何正确编码新版本。这是原始文件:
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:_)'临时将内存视为另一种布局兼容类型。
我在这里查看了几个线程,并阅读了涵盖此内容的发行说明,但我仍然对应该在此处执行的操作感到困惑。
您已解决了一个问题,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)
这个通用的初始化程序会自动管理传入的内存,推断数组的数量,并primitiveCount
根据数组的数量和primitiveType
您指定的数量推断。
(请注意,四个索引组成的数组对于来说是一个不寻常的数字.triangles
;或者您有一个三角形和一个未使用的索引,或者实际上是一个.triangleStrip
包含两个基元的对象。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句