Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

886
Views
Convierta la cadena Swift en un puntero CChar

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.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!