Насколько я прочитал документ, параметр star
используется как для входа, так и для выхода, поэтому star
функции Swift должно быть inout
.
И long
импортируется как Int
, и на 64-разрядных платформах Apple он представляет 64-разрядный целочисленный тип со знаком; если он на самом деле 32-разрядный, вам может потребоваться обновить исходные файлы кода C.Я предполагаю, что это Int
.
Итак, я бы написал код моста следующим образом:
public func sweFixStarsUT(star: inout String, tjdUT: Double, iFlag: Int) {
let starLen = max(star.utf8.count, 41)
var starBuf: [CChar] = Array(repeating: 0, count: starLen+1)
strcpy(&starBuf, star)
var xx: [Double] = Array(repeating: 0.0, count: 6)
var serr: [CChar] = Array(repeating: 0, count: 256)
swe_fixstar2_ut(&starBuf, tjdUT, iFlag, &xx, &serr)
star = String(cString: starBuf)
}
Я предпочитаю использовать массивы при передаче указателей на C-функцию, когда функцияне сохраняет указатели для последующего использования.С использованием массивов вам не нужно беспокоиться об освобождении.
Вы можете видеть, как код преобразует входные данные star
в массив CChar и скрывает массив в строку.
Если вы нашли что-то не так с этим кодом, пожалуйста, сообщите мне.