从C API接收多维数组,如何在Swift中处理?

jup*_*ppy 6 c arrays ios swift

我在Swift应用程序中使用了C库,但无法弄清楚如何获取C方法应该返回的多维数组。

我从C API收到此消息:

struct resultArray
{
    double *data;
    int size[2];
};
Run Code Online (Sandbox Code Playgroud)

哪里:

size =矩阵大小,一个包含行数和列数的两个元素的数组

数据=矩阵数据

我可以迅速进行以下操作以获取大小:

let numRows = Int(results.size.0)
let numColoumns = Int(results.size.1)
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何获得矩阵以便可以迭代它?我尝试了以下方法:

let matrixResult = results.data.memory
Run Code Online (Sandbox Code Playgroud)

这似乎只返回一个double值,因为matrixResult变为Double。

然后我尝试了这个:

let matrixResult = results.data
Run Code Online (Sandbox Code Playgroud)

这使得matrixResult为:

UnsafeMutablePointer<Double>
Run Code Online (Sandbox Code Playgroud)

我希望收到C库文档中指定的矩阵。然后我想遍历此矩阵并从第一行获取值并将其放入Swift数组中。有人知道我在这里缺少什么吗?

Mar*_*n R 4

C 中没有矩阵data类型。假设这是一个指向存储为数组的连续矩阵元素的指针,您可以使用以下命令将第一行复制到 Swift 数组

let firstRow = Array(UnsafeBufferPointer(start: results.data, count: numColumns))
Run Code Online (Sandbox Code Playgroud)

以及整个“矩阵”到一个嵌套的 Swift 数组

let matrix = (0 ..< numRows).map { row in
    Array(UnsafeBufferPointer(start: results.data + numColumns * row, count: numColumns))
}
Run Code Online (Sandbox Code Playgroud)

或者(这与Melifaro 建议的类似),您可以创建一个指向矩阵行的指针数组:

let matrix = (0 ..< numRows).map { row in
    UnsafeBufferPointer(start: results.data + numColumns * row, count: numColumns)
}
Run Code Online (Sandbox Code Playgroud)

这仍然允许以类似矩阵的方式寻址任意元素

 let element = matrix[row][col]
Run Code Online (Sandbox Code Playgroud)

但不复制数据。当然,这要求矩阵数据在整个使用过程中都有效matrix,因为内存不是由 Swift 管理的。