在 Swift 框架内的导入 C 函数中设置文件路径
Setting file path in imported C function inside Swift Framework
我正在尝试在我的 Cocoa 框架中使用 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)
}
}
但是好像不行,需要在文件中查找数据的功能无法运行。
如果有人有兴趣查看瑞士图书馆文档,请在此处查看 link,
https://www.astro.com/swisseph/swephprg.htm#_Toc505244836
有两个问题:
首先,资源文件位于框架的“Resources”子目录中,而不是 top-level 框架目录中。您可以使用
获取该目录的路径
let resourcePath = Bundle(identifier: "com.Abhi.SwissFramework")!.resourcePath!
或与
let resourcePath = Bundle(for: type(of: self)).resourcePath!
我建议 force-unwrap 选项,因为您 知道 包和资源目录存在。失败将表明应该及早检测到构建问题。
其次,C 函数采用 char *
参数,即使它不会改变传递的字符串。在这里您可以使用 :
中的方法
resourcePath.withCString {
swe_set_ephe_path(UnsafeMutablePointer(mutating: [=12=]))
}
甚至更好:使用专用方法 withUnsafeFileSystemRepresentation()
获取资源路径的文件系统表示形式作为 C 字符串:
let resourceURL = Bundle(for: type(of: self)).resourceURL!
resourceURL.withUnsafeFileSystemRepresentation {
swe_set_ephe_path(UnsafeMutablePointer(mutating: [=13=]))
}
我正在尝试在我的 Cocoa 框架中使用 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)
}
}
但是好像不行,需要在文件中查找数据的功能无法运行。
如果有人有兴趣查看瑞士图书馆文档,请在此处查看 link, https://www.astro.com/swisseph/swephprg.htm#_Toc505244836
有两个问题:
首先,资源文件位于框架的“Resources”子目录中,而不是 top-level 框架目录中。您可以使用
获取该目录的路径let resourcePath = Bundle(identifier: "com.Abhi.SwissFramework")!.resourcePath!
或与
let resourcePath = Bundle(for: type(of: self)).resourcePath!
我建议 force-unwrap 选项,因为您 知道 包和资源目录存在。失败将表明应该及早检测到构建问题。
其次,C 函数采用 char *
参数,即使它不会改变传递的字符串。在这里您可以使用
resourcePath.withCString {
swe_set_ephe_path(UnsafeMutablePointer(mutating: [=12=]))
}
甚至更好:使用专用方法 withUnsafeFileSystemRepresentation()
获取资源路径的文件系统表示形式作为 C 字符串:
let resourceURL = Bundle(for: type(of: self)).resourceURL!
resourceURL.withUnsafeFileSystemRepresentation {
swe_set_ephe_path(UnsafeMutablePointer(mutating: [=13=]))
}