2015-01-22 3 views
1

Я хочу, чтобы вызвать Си ++ в быстройбыстротекущех вопросов по поводу строки и С зЬгсру

bool getId3Info(const char * filename , char *artist , char * title ) 
{ 
    // get the file's id3v2 tag, write info back 
    strcpy(artist,(const char*) id3v2tag->artist().toCString(true)); 
    strcpy(title,id3v2tag->title().toCString(true)); 
} 

Так я пишу объект-с оберткой для этой функции:

-(bool) getId3Info:(const char *)filename :(const char *)artist :(const char *) title 
{ 
    return getId3Info(filename, (char*)artist, (char*)title); 
} 

Таким образом, вопросов есть Я могу получить только представление строки C, используя cStringUsingEncoding,
не может получить истинный буфер быстрого String,
есть ли другой способ сделать это?

ответ

0

В Swift, вы можете передать const char* на функцию C, как это:

func foo(s: String) { s.withCString({ p in cfunction(p) }) } 

или, чтобы быть более четко о типе:

func foo(s: String) { s.withCString({ (p:UnsafePointer<CChar>) in cfunction(p) }) } 

(т.е. р является UnsafePointer<CChar> , эквивалентно const char*)

Если вы хотите инициализировать строку из функции C, вам потребуется более сложное заклинание, примерно следующее:

var buf = Array<CChar>(count: 1000, repeatedValue: 0); 
let result = buf.withUnsafeMutableBufferPointer({ 
     (inout ptr: UnsafeMutableBufferPointer<CChar>) -> String? in 
    cfunction(ptr.baseAddress, ptr.count - 1) 
    String.fromCString(ptr.baseAddress) 
}) 

Обратите внимание, что функция C должна оставить буфер с нулевым завершением. Либо он никогда не должен изменять последний байт (таким образом, ptr.count - 1, как и вы звоните strncpy), или ему нужно добавить нулевой ограничитель (например, snprintf), и в этом случае вы можете передать полный размер буфера.