Я работаю с функцией C в моем коде Swift, который выводит массив. Функция не возвращает массив, потому что, по-видимому, в C функциям не рекомендуется возвращать массивы. Поэтому функция принимает параметр in-out
(в качестве указателя) и помещает туда массив.
Функция C:
void kRing(H3Index origin, int k, H3Index* out);
H3Index*
- это out
параметр, который принимает массив. Тем не менее, как я могу получить массив из этой функции в Swift? H3Index*
, параметр out
, указывает на целое число. И, очевидно, в C, вы можете указать на целое число, передать этот указатель на функцию, и эта функция может разместить массив вместо этого указателя (даже если он указывает на целое число).
Но из-за безопасности типов Swift это затрудняет получение массива из функции. Версия Swift:
kRing(origin: H3Index, k: Int32, out: UnsafeMutablePointer<H3Index>!)
Реализация My Swift:
let h3Index: H3Index = 600022775385554943 // integer
let k: Int32 = 2 // integer
var result = H3Index() // the in-out parameter (must be integer to satisfy Swift's type safety)
_ = withUnsafeMutablePointer(to: &result) { kRing(h3Index, k, $0) }
print(result)
И он печатает результат (с ошибкой неверного доступа, которая меня сейчас не волнует). Но результатом является целое число, когда оно должно быть массивом. Как это сделать?
Реализация C, для справки:
H3Index indexed = 0x8a2a1072b59ffffL; // 64-integer (hex)
int k = 2; // integer
int maxNeighboring = maxKringSize(k); // integer
H3Index* neighboring = calloc(maxNeighboring, sizeof(H3Index)); // the out parameter (a pointer to an integer and/or array)
kRing(indexed, k, neighboring); // the function
for (int i = 0; i < maxNeighboring; i++) {
if (neighboring[i] != 0) {
// iterate through array
}
}