Mar*_*ark 9 c language-interoperability swift
我正在尝试与Swift的旧C终端应用程序进行交互.我已成功集成源代码并将标头从C桥接到Swift.该代码从Xcode 6.3 beta编译并运行.我已将终端应用程序的主要入口点重命名为:
int initialize(int argc, char **argv);
Run Code Online (Sandbox Code Playgroud)
然而,我正在努力将Swift中的参数传递给这个C函数.我的挑战是以正确的格式转换参数.Swift的典型输入看起来像:
let args = ["-c", "1.2.3.4", "-p", "8000"]
Run Code Online (Sandbox Code Playgroud)
我已经尝试搞乱"cStringUsingEncoding(NSUTF8StringEncoding)"和"withUnsafePointer",但到目前为止还没有运气.任何帮助是极大的赞赏!
Mar*_*n R 11
C功能
int initialize(int argc, char **argv);
Run Code Online (Sandbox Code Playgroud)
映射到Swift as
func initialize(argc: Int32, argv: UnsafeMutablePointer<UnsafeMutablePointer<Int8>>) -> Int32
Run Code Online (Sandbox Code Playgroud)
这是一个可能的解决方案:
let args = ["-c", "1.2.3.4", "-p", "8000"]
// Create [UnsafeMutablePointer<Int8>]:
var cargs = args.map { strdup($0) }
// Call C function:
let result = initialize(Int32(args.count), &cargs)
// Free the duplicated strings:
for ptr in cargs { free(ptr) }
Run Code Online (Sandbox Code Playgroud)
它使用strdup($0)
Swift字符串中的事实$0
自动转换为C字符串,如String值为UnsafePointer <UInt8>函数参数行为中所述.
归档时间: |
|
查看次数: |
1732 次 |
最近记录: |