2016-07-08 2 views
3

에에 문자열의 신속한 배열을 변환, 그리고 예를 들어, 문자열의 NULL로 끝나는 목록을 받아들이는 C의 API와 상호 작용해야내가 스위프트 3에있어 C 문자열 배열 포인터

const char *cmd[] = {"name1", "value1", NULL}; 
command(cmd); 
스위프트에서

는 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