Convertir de cadena Swift a const char*

2 minutos de lectura

Convertir de cadena Swift a const char
steven b

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

Convertir de cadena Swift a const char
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)

Ver Interactuar con las API de C para más información. Aquí está el extracto relevante:

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

1647659706 279 Convertir de cadena Swift a const char
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?

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
Privacidad