ios – 如何使用来自Swift的UnsafeMutablePointer>引用?

前端之家收集整理的这篇文章主要介绍了ios – 如何使用来自Swift的UnsafeMutablePointer>引用?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用SceneKit的SCNParticleSystem构建测试应用程序.它有一个回调,可以让您修改每个框架上的粒子属性.这个回调的签名是
typealias SCNParticleModifierBlock = (UnsafeMutablePointer<UnsafeMutablePointer<Void>>,UnsafeMutablePointer<Int>,Int,Float) -> Void

苹果开发者站点参考 – 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)
    }
}¸

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

indexes 0 0
indexes 0 3
0 0.929816
1 1.51296e-39
(lldb)

接近我可以告诉任何人在互联网上使用这个功能.我发现的唯一的参考是苹果的文档,只提供ObjC的例子,而不是Swift.

帮我!

解决方法

例如:
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]

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

let myptr = UnsafeMutablePointer<UnsafeMutablePointer<Foos>>(data)

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

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

for i in start..<end {
...
}

你确定开始是0吗?

猜你在找的iOS相关文章