在Swift Framework内部的导入的C函数中设置文件路径

时间:2019-05-11 03:39:09

标签: c swift xcode cocoa language-interoperability

我正在尝试在功能名为

的Cocoa Framework中使用C库源文件。
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 :(得分:0)

有两个问题:

首先,资源文件位于框架的``Resources''子目录中,而不是顶级框架目录中。您可以使用

获取该目录的路径
sum = 10.000000  100.000000  1000.000000  10000.000000

或搭配

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

我建议强行打开可选包装,因为您知道包和资源目录存在。失败将指示应尽早发现构建问题。

第二,即使C函数不改变传递的字符串,它也会接受一个let resourcePath = Bundle(for: type(of: self)).resourcePath! 参数。在这里,您可以使用UnsafeMutablePointer<Int8> from String in Swift中的方法:

char *

甚至更好:使用专用方法resourcePath.withCString { swe_set_ephe_path(UnsafeMutablePointer(mutating: $0)) } 以C字符串的形式获取资源路径的文件系统表示形式:

withUnsafeFileSystemRepresentation()