【问题标题】:SCNGeometryElement setup in Swift 3Swift 3 中的 SCNGeometryElement 设置
【发布时间】:2021-10-08 10:40:33
【问题描述】:

我硬着头皮开始将我的应用程序转换为 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:_)”临时将内存视为另一种布局兼容类型。

我在这里查看了几个线程,并阅读了涵盖此内容的发行说明,但我仍然对我应该在这里做什么感到困惑。

【问题讨论】:

    标签: swift cocoa swift3 scenekit


    【解决方案1】:

    您修复了一个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)
    

    (还要注意使您的MemoryLayouts 与他们描述的数据一致的修复程序。)

    但是,除非您需要额外的 Data 对象,为了获得指针的乐趣,或者在描述您的元素时需要额外的特殊性,否则您可以使用更简单的形式:

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

    This generic initializer 在进入的过程中自动管理内存,推断数组的计数,并根据数组的计数和您指定的primitiveType 推断primitiveCount。

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

    【讨论】:

    • 这是一个很好的答案,一如既往,rickster。我非常感谢这种简化。具有讽刺意味的是,最初的三行版本来自 Apple 自己的示例。
    • 较旧的示例,可能从未更新。我发现当你 file bugs against developer documentation 时,他们经常会快速修复。
    猜你喜欢
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    相关资源
    最近更新 更多