Estoy tratando de pasar un const char * a una antigua biblioteca C convertida de una cadena Swift en Swift.
Esta es la función C que estoy llamando:
artnet_node artnet_new(const char *ip, int verbose) { ...
¿Cómo puedo convertir una cadena Swift a este tipo de caracteres const? Funciona cuando paso ipAddress así:
internal var ipAddress = "192.168.1.43"
pero dit no funciona cuando lo paso asi
internal var ipAddress:String = "192.168.1.43"
Necesito esto en una función donde necesito especificar el tipo:
internal func setupArtnode(ip:String) -> Int{
Intenté usar AnyObject en lugar de String pero tampoco funciona.
Gracias.
Agregue una aclaración sobre lo que no funciona: compilación o ejecución, y cualquier mensaje de error asociado.
– cabina
24 de diciembre de 2016 a las 3:23
cabina
Deberías poder pasar un String directamente a una función C esperando const char * y se convertirá automáticamente en una cadena UTF-8 terminada en nulo:
let string = "string"
let node = artnet_new(string, 1)
Cuando se declara que una función toma un argumento UnsafePointer, puede aceptar cualquiera de los siguientes:
Un valor de cadena, si el tipo es Int8 o UInt8. La cadena se convertirá automáticamente a UTF8 en un búfer y se pasará un puntero a ese búfer a la función.
por alguna razón, la función no toma el argumento y toma el valor predeterminado, actualicé la pregunta con más información
– Steven B.
23 dic 2016 a las 23:01
su cotización me hizo usar UnsafePointer que parecía funcionar, agregué mi código de trabajo. ¡¡Gracias!!
– Steven B.
28 de diciembre de 2016 a las 11:18
No estoy seguro de por qué, pero este código está funcionando. Esto pasa una cadena a una función de C que espera un const char* que parece ser lo mismo que un puntero inseguro.
internal func setupArtnode(ipAddress:String) -> NSInteger{
let cString = self.ipAddress.cString(using: String.defaultCStringEncoding)!
let newString:String = NSString(bytes: cString, length: Int(ipAddress.characters.count), encoding:String.Encoding.ascii.rawValue)! as String
let key2Pointer = UnsafePointer<Int8>(newString)
node = artnet_new(key2Pointer, Int32(verbose)) // VERBOSE : true(1) , false(0)
...
Manera simple para Swift 3
var ipAddress: String = "192.168.1.43"
var verbose: Int = 1
artnet_node artnet_new((ipAddress as NSString).utf8String, verbose)
Mientras usaba la API sqlite3 sqlite3_bind_text() con swift, veía daños en la memoria y resultados extraños si se pasaba directamente la cadena. (ipAddress as NSString).utf8String arreglado esto
– vid
30 oct 2018 a las 10:15
Código Diferente
No especificó qué contiene su matriz Swift. En cualquier caso, debe convertir su matriz Swift en una matriz de Int8:
let str = "Hello world"
let cArray = str.cString(using: .utf8)
artnet_new(cArray, 1)
¿Ha sido útil esta solución?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Configurar y más información
Agregue una aclaración sobre lo que no funciona: compilación o ejecución, y cualquier mensaje de error asociado.
– cabina
24 de diciembre de 2016 a las 3:23