如何使用Swift的UnsafeMutablePointer <UnsafeMutablePointer <Void >>引用?

Jos*_*cci 11 ios scenekit swift

我正在使用SceneKit构建测试应用程序SCNParticleSystem.它有一个回调函数,允许您修改每个帧上的粒子属性.这个回调的签名是

typealias SCNParticleModifierBlock = (UnsafeMutablePointer<UnsafeMutablePointer<Void>>, UnsafeMutablePointer<Int>, Int, Int, Float) -> Void
Run Code Online (Sandbox Code Playgroud)

来自apple开发人员站点的参考 - SCNParticleSystem_Class

我不知道如何从Swift访问和修改此引用.如果这是C,那么**我可以像数组一样取消引用.

经过一番预测后,我已经达到了这个目的:

..... 
           particleSystem?.addModifierForProperties([SCNParticlePropertySize], atStage: SCNParticleModifierStage.PostDynamics, withBlock: doit2)
}

struct Foos {
    var size:float_t
}
func doit2(data:UnsafeMutablePointer<UnsafeMutablePointer<Void>>, dataStride: UnsafeMutablePointer<Int>, start:Int, end:Int, deltaTime:Float) -> Void {
    let myptr = UnsafeMutablePointer<UnsafeMutablePointer<Foos>>(data)
    print("indexes",start,end)
    for i in 0 ..< end {
        print(i,myptr[i].memory.size)
    }
}¸
Run Code Online (Sandbox Code Playgroud)

这适用于第一个粒子,但在第二个粒子上崩溃.第一次调用该函数时,有0个粒子,因此它会跳过循环.第二次有三个粒子,所以它试图将它们打印出来.第一个尺寸值为0.9,接缝合理.第二个大小的值显然是假的,然后它崩溃了,我进入调试器.

indexes 0 0
indexes 0 3
0 0.929816
1 1.51296e-39
(lldb)
Run Code Online (Sandbox Code Playgroud)

我可以告诉我,互联网上没有人使用这个功能.我找到的唯一参考是Apple的文档,它只为它提供ObjC示例,而不是Swift.

帮我!

use*_*734 1

例如:

var data = [[0.1, 0.2],[0.3, 0.4],[0.5, 0.6]]
let pData = UnsafeMutablePointer<UnsafeMutablePointer<Void>>(data)
// how to reconstruct the original data ??

// we need to know how much data we have
let count = data.count
// we need to know what type of data we have
let p2 = UnsafeMutablePointer<Array<Double>>(pData)
// access the data
for i in 0..<count {
    print((p2 + i).memory)
}
// [0.1, 0.2]
// [0.3, 0.4]
// [0.5, 0.6]
Run Code Online (Sandbox Code Playgroud)

我认为在你的代码中, myptr 的声明是错误的

let myptr = UnsafeMutablePointer<UnsafeMutablePointer<Foos>>(data)
Run Code Online (Sandbox Code Playgroud)

示例中的 dataStride.count 应为 1 (属性数量),其元素值应为 float 大小(属性大小)。

也要小心!你的循环应该是这样的

for i in start..<end {
...
}
Run Code Online (Sandbox Code Playgroud)

你确定开头是0???