一尘不染

如何将Swift字符串数组传递给带有char **参数的C函数

swift

我正在尝试与Swift的旧C终端应用程序进行交互。我已经成功集成了源代码,并将标头从C桥接到Swift。该代码从Xcode 6.3
beta编译并运行。我已将终端应用程序的主要入口点重命名为:

int initialize(int argc, char **argv);

不过,我正在努力将Swift的参数传递给此C函数。我的挑战是将参数转换为正确的格式。Swift的典型输入如下所示:

let args = ["-c", "1.2.3.4", "-p", "8000"]

我试过弄乱“ cStringUsingEncoding(NSUTF8StringEncoding)”和“
withUnsafePointer”,但到目前为止还没有运气。任何帮助是极大的赞赏!


阅读 307

收藏
2020-07-07

共1个答案

一尘不染

C函数

int initialize(int argc, char **argv);

被映射为Swift

func initialize(argc: Int32, argv: UnsafeMutablePointer<UnsafeMutablePointer<Int8>>) -> Int32

这是一个可能的解决方案:

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) }

它使用这样的事实:在strdup($0) Swift字符串中$0会自动将其转换为C字符串,如UnsafePointer
<UInt8>函数参数行为的字符串值中所述

2020-07-07