arrays - 取消引用 UnsafeMutablePointer<UnsafeMutableRawPointer>

标签 arrays swift3 unsafemutablepointer

我有一个正在传递数据的 block ,我想将其转换为 float 组的数组 - 例如[[0.1,0.2,0.3,1.0],[0.3,0.4,0.5,1.0],[0.5,0.6,0.7,1.0]]。这些数据以data:UnsafeMutablePointer<UnsafeMutableRawPointer>的形式传递给我。 (内部数组为RGBA值)

fwiw -- block 参数来自SCNParticleEventBlock

如何将数据取消引用到 [[Float]] 中?一旦我有了包含内部数组的数组,我就可以通过以下方式引用内部数组 (colorArray) 数据:

let rgba: UnsafeMutablePointer<Float> = UnsafeMutablePointer(mutating: colorArray)
let count = 4
for i in 0..<count {
    print((rgba+i).pointee)
}

fwiw -- 这是 Apple 用于引用数据的 Objective-C 代码示例 ( from SCNParticleSystem handle(_:forProperties:handler:) )

[system handleEvent:SCNParticleEventBirth
      forProperties:@[SCNParticlePropertyColor]
          withBlock:^(void **data, size_t *dataStride, uint32_t *indices , NSInteger count) {
              for (NSInteger i = 0; i < count; ++i) {
                  float *color = (float *)((char *)data[0] + dataStride[0] * i);
                  if (rand() & 0x1) { // Switch the green and red color components.
                      color[0] = color[1];
                      color[1] = 0;
                  }
              }
          }];

最佳答案

您实际上可以为类型化的 UnsafeMutablePointer 添加下标,而无需创建 UnsafeMutableBufferPointer,如下所示:

let colorsPointer:UnsafeMutableRawPointer = data[0] + dataStride[0] * i
let rgbaBuffer = colorsPointer.bindMemory(to: Float.self, capacity: dataStride[0])
if(arc4random_uniform(2) == 1) {
    rgbaBuffer[0] = rgbaBuffer[1]
    rgbaBuffer[1] = 0
}

您的解决方案能够发挥作用吗?看来在 SCNParticleEventBlock block 中只能使用少数 SCNParticleProperties

关于arrays - 取消引用 UnsafeMutablePointer<UnsafeMutableRawPointer>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44476834/

相关文章:

ios - 从 swift 的子类函数导航到 viewcontroller

ios - WKWebView 添加到 subview ,并设置大小等于父级?

ios - 如何获取 Swift 对象的 AutoreleasingUnsafeMutablePointer

objective-c - 将 UnsafeMutablePointer 传递给函数时出错

ios - 如何在 Swift3 中将 Any 转换为字典

javascript - 在 Angular 6 上解析并忽略多维数组内的空数据

javascript - 如何将三个 1D 数组变成 3D 数组

arrays - F# 中 Array.replicate 和 Array.create 之间有功能差异吗?

swift - UnsafeMutablePointer<Float> 到 UnsafeMutablePointer<_>

ios - 如何通过标签访问 NSMutablearray 中的对象?