2016-07-08 55 views
3

我在夫特3,我需要与C API,它接受字符串的NULL结尾的列表进行交互,例如字符串转换的夫特阵列到到C字符串数组指针

在斯威夫特的API是进口同类

func command(_ args: UnsafeMutablePointer<UnsafePointer<Int8>?>!) 

尝试数百使用类型转换或unsafeAddress(of:)我仍然不能得到这个工作,次后。尽管我传递了一个通过编译的有效指针,但它在运行时崩溃,说无效的内存访问(在strlen函数中)。或者也许这是关于ARC的东西?

let array = ["name1", "value1", nil] 

// ??? 
// args: UnsafeMutablePointer<UnsafePointer<Int8>?> 

command(args) 
+0

的可能的复制https://stackoverflow.com/questions/29469158/how-to-pass-an-array-of-swift-strings-to- ac-function-taking-a-char-parameter –

回答

4

您可以按照与How to pass an array of Swift strings to a C function taking a char ** parameter类似的方式进行操作。它有点不同,因为参数数组的 const-因为有一个终止的 nil(它不能传递给strdup())。

这是它应该是如何工作的:

let array: [String?] = ["name1", "name2", nil] 

// Create [UnsafePointer<Int8>]: 
var cargs = array.map { $0.flatMap { UnsafePointer<Int8>(strdup($0)) } } 
// Call C function: 
let result = command(&cargs) 
// Free the duplicated strings: 
for ptr in cargs { free(UnsafeMutablePointer(mutating: ptr)) } 
+0

谢谢!奇迹般有效 :] – 00007chl