Float-Array转换

时间:2018-03-24 23:45:51

标签: c++ ios arrays swift objective-c++

我有一个这样的矢量:

vector<Vec3f> myCoolVector

填充了[1.0, 2.0, 3.1][4.2, 2.1, 7.7]...等数组。

我想将myCoolVector转换回2d-array of floats,将其作为简单的多维 Float数组发送回Swift(如下所示:{{1} })。

  

但是我得到的回复(对Swift)是一个变量,这个疯狂的类型:

[[Float]]
     

...而不仅仅是这种类型:Optional<UnsafeMutablePointer<Optional<UnsafeMutablePointer<Float>>>>


请查看我的代码:

(1)代码 - C ++

[[Float]]

(2)代码 - Swift

+(float **)myCoolFunction {
    vector<Vec3f> myCoolVector

    // here fillMyCoolVector() fills the myCoolVector - NICE

    float **floatArrayBackToSwift;
    floatArrayBackToSwift = new float*[myCoolVector.size()];

    for( size_t i = 0; i < myCoolVector.size(); i++ )
    {
        ary[i] = new float[3];
        ary[i][0] = myCoolVector[i][0];
        ary[i][1] = myCoolVector[i][1];
        ary[i][2] = myCoolVector[i][2];
    }
    return floatArrayBackToSwift;
}

我的问题:如何将let floatArray = MyBridge.myCoolFunction() // should be [[1.0, 2.0, 3.1], [4.2, 2.1, 7.7], ...] print(floatArray) 作为简单的二维数组(例如myCoolVector)发送回Swift?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

您的myCoolFunction返回float **,指针指向float的指针。 并且C / C ++中的任何指针类型都不能自动转换为Swift Array,也不能自动转换为C / C ++中的任何其他类型。

如果您确实希望结果位于Array<Array<Float>>(又名[[Float]]),则需要编写一些Swift代码以将Optional<UnsafeMutablePointer<Optional<UnsafeMutablePointer<Float>>>>转换为Array<Array<Float>>

这样的事情:

class MyWrappter {
    static func myCoolFunction(count: Int) -> [[Float]] {
        let ptrPtrFloat: UnsafeMutablePointer<UnsafeMutablePointer<Float>?>! = MyBridge.myCoolFunction()

        let bpPtrFloat = UnsafeBufferPointer(start: ptrPtrFloat, count: count)
        return bpPtrFloat.map {ptrFloat in
            [ptrFloat![0], ptrFloat![1], ptrFloat![2]]
        }
    }
}

请注意,您的myCoolFunction不会返回有关vector<Vec3f>大小的任何信息,因此您可能需要使用其他方法将其传递给Swift方。

Swift不擅长优化嵌套数组。最好考虑采用simd.float3或类似的东西。