En mi proyecto de aplicación rápida, tengo que interactuar con las API de C. Una de las funciones de C toma un puntero de caracteres como entrada, por lo tanto, tengo que convertir mi cadena rápida en un puntero de caracteres. Pero no sé cómo hacerlo correctamente.
Aquí está mi código de muestra:
var user_id_ptr : UnsafeMutablePointer<CChar> = UnsafeMutablePointer.alloc(100) var cusID = "123" user_id_ptr.memory = cusID.cStringUsingEncoding(NSUTF8StringEncoding)! Y siempre recibí este error: Cannot assign a value of type '[CChar]' to a value of type 'CChar'
También verifico la respuesta en: UnsafeMutablePointer<Int8> from String in Swift
La respuesta anterior es ligeramente diferente a la mía. El ejemplo anterior es para un solo carácter, pero tengo una cadena. Además, tengo que pasar múltiples argumentos a la función, no puedo usar algo como let result = "N".withCString { dgeev_(UnsafeMutablePointer($0), UnsafeMutablePointer($0), &N, ...) }. Por favor, muéstrame algún ejemplo de cómo completar esto.
Si la función C no muta las cadenas pasadas como argumentos, entonces los parámetros deben declararse como const char * , por ejemplo
int func1(const char *s1, const char *s2);y en ese caso, simplemente puede pasar cadenas Swift que se convierten automáticamente (compare el valor de la cadena con el comportamiento del parámetro de la función UnsafePointer<UInt8> ):
let str1 = "first string argument" let str2 = "second string argument" let result1 = func1(str1, str2) Si los parámetros de la función se declaran como char *
int func2(char *s1, char *s2); luego debe usar withCString() para obtener una representación temporal de la cadena como una matriz terminada en NUL de caracteres UTF-8:
let str1 = "first string argument" let str2 = "second string argument" // Swift 2: let result2 = str1.withCString { s1 in str2.withCString { s2 in func2(UnsafeMutablePointer(s1), UnsafeMutablePointer(s2)) } } // Swift 3: let result2 = str1.withCString { s1 in str2.withCString { s2 in func2(UnsafeMutablePointer(mutating: s1), UnsafeMutablePointer(mutating: s2)) } } Tenga en cuenta que esto aún asume que la función no muta las cadenas pasadas, la conversión UnsafeMutablePointer() solo es necesaria para hacer feliz al compilador.