在Swift中使用C const变量作为UnsafePointer

时间:2014-11-27 20:23:58

标签: ios c swift opengl-es

我在.h / c文件中有一个简单的C const变量,如下所示:

data.h

const float positions[9];

data.c

#include "data.h"
const float positions[9] = {
    1.0, -1.0, 1.0,
    -1.0, -1.0, 1.0,
    -1.0, -1.0, -1.0,
};

夫特

如何在Swift中使用此变量的数据?更具体地说,我需要将数据传递给glVertexAttribPointer(,,,,, <#ptr: UnsafePointer<Void>#>)

例如,我在Swift中有以下代码:(我将 data.h 添加到桥接头中):

glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), 0, positions)
// Error: '(Float, Float, Float, Float, Float, Float, Float, Float, Float)' is not convertible to 'UnsafePointer<Void>'
glDrawArrays(GLenum(GL_TRIANGLES), 0, 3)

我得到的错误是'(Float,Float,Float,Float,Float,Float,Float,Float,Float)'不能转换为'UnsafePointer&lt; Void&gt;'

我应该指出,这只是一个测试应用,所以我没有使用VBO(Listing 8-2)。

1 个答案:

答案 0 :(得分:3)

结果是静态分配的C数组作为元组进入Swift。使用指针变量来修复问题。

  1. 在C中:const float positions[9];转换为
    Swift中的let positions: (Float, Float, Float, Float, Float, Float, Float, Float, Float)

  2. 在C中:const float *positions;转换为
    Swift中的var positions: UnsafePointer<Float> (这是我们需要的)

  3. 所以修改C文件如下所示:

    data.h

    const float *positions;
    

    data.c

    #include "data.h"
    const float _positions[9] = {
        1.0, -1.0, 1.0,
        -1.0, -1.0, 1.0,
        -1.0, -1.0, -1.0,
    };
    const float *positions = _positions;
    

    夫特

    glVertexAttribPointer(0, 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), 0, positions)
    

    将数组作为Swift中的元组似乎很奇怪,如果有人对此有任何想法,我会很感激一些反馈。