2016-07-08 12 views
3

にする文字列のスウィフト配列を変換し、そして私は、たとえば、文字列のNULL終端リストを受け入れCのAPIと対話する必要が私はスウィフト3によC文字列の配列ポインタ

スウィフトは

、APIは、私はまだこの仕事を得ることができないタイプのキャストやunsafeAddress(of:)を使用して何百回も試した後

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

のようにインポートされました。私はコンパイルをパスした有効なポインタを渡しても、実行時に無効なメモリアクセス(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