gpt4 book ai didi

ios - 如何使用 Swift 中的 UnsafeMutablePointer> 引用?

转载 作者:IT王子 更新时间:2023-10-29 05:32:11 28 4
gpt4 key购买 nike

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

typealias SCNParticleModifierBlock = (UnsafeMutablePointer<UnsafeMutablePointer<Void>>, UnsafeMutablePointer<Int>, Int, Int, Float) -> Void

来自苹果开发者网站的引用 - SCNParticleSystem_Class

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

经过一些 futzing 我得到了这样的结果:

..... 
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)

据我所知,互联网上没有人使用此功能。我找到的唯一引用资料是 Apple 的文档,它只提供了 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 - 如何使用 Swift 中的 UnsafeMutablePointer<UnsafeMutablePointer<Void>> 引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33249056/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com