2016-07-08 95 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