Установка пути к файлу в импортированной функции C внутри Swift Framework - PullRequest
1 голос
/ 11 мая 2019

Я пытаюсь использовать исходные файлы библиотеки C внутри моей Cocoa Framework, которая имеет функцию с именем

void swe_set_ephe_path(char *path);

, которая в основном будет

swe_set_ephe_path(”C:\\SWEPH\\EPHE”);

для Windows.

Эта библиотека содержит другие файлы данных, которые работают только после установки этой функции.При импорте в Swift функция выглядит следующим образом

swe_set_ephe_path(path: UnsafeMutablePointer<Int8!>)

Поскольку я хочу связать все файлы данных в платформе и использовать ее в своем приложении, я сделал что-то вроде этого

public class SwissEphemeris {
     public init() {
        let path = Bundle.main.bundlePath
        let swePath = UnsafeMutablePointer<Int8>(mutating: (path as NSString).utf8String)
        swe_set_ephe_path(swePath)
     }
}

Но, похоже, он не работает, и функции, для которых требуется поиск данных в файлах, не могут работать.

Here is the picture for my directory structure

Если кто-то заинтересован в просмотре документации Швейцарской библиотеки, проверьте здесь ссылку https://www.astro.com/swisseph/swephprg.htm#_Toc505244836

1 Ответ

0 голосов
/ 12 мая 2019

Есть две проблемы:

Во-первых, файлы ресурсов находятся в подкаталоге «Ресурсы» платформы, а не в каталоге инфраструктуры верхнего уровня.Вы можете получить путь к этому каталогу с помощью

let resourcePath = Bundle(identifier: "com.Abhi.SwissFramework")!.resourcePath!

или с помощью

let resourcePath = Bundle(for: type(of: self)).resourcePath!

. Я предлагаю принудительно развернуть дополнительные параметры, поскольку вы знаете , что пакет икаталог ресурсов существует.Ошибка указывает на проблему со сборкой, которая должна быть обнаружена раньше.

Во-вторых, функция C принимает аргумент char *, даже если она не изменяет переданную строку.Здесь вы можете использовать подход из UnsafeMutablePointerиз String в Swift :

resourcePath.withCString {
    swe_set_ephe_path(UnsafeMutablePointer(mutating: $0))
}

Еще лучше: используйте выделенный метод withUnsafeFileSystemRepresentation(), чтобы получить представление файловой системы пути ресурса в виде строки C:

let resourceURL = Bundle(for: type(of: self)).resourceURL!
resourceURL.withUnsafeFileSystemRepresentation {
    swe_set_ephe_path(UnsafeMutablePointer(mutating: $0))
}
...