我正在尝试在功能名为
的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)
}
}
但是,这似乎不起作用,并且需要在文件中搜索数据的功能无法运行。
如果有兴趣研究瑞士图书馆文档的人,请在此处查看链接, https://www.astro.com/swisseph/swephprg.htm#_Toc505244836
答案 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()