我有一个这样的矢量:
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?
非常感谢任何帮助!
答案 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
或类似的东西。