如何使用char**参数将Swift字符串数组传递给C函数

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>函数参数行为中所述.