In my swift app project, I have to interact with C APIs. One of the C function takes a char pointer as input, therefore I have to convert my swift string into char pointer. But I don't know how to do it properly.
Here's my sample code:
var user_id_ptr : UnsafeMutablePointer<CChar> = UnsafeMutablePointer.alloc(100)
var cusID = "123"
user_id_ptr.memory = cusID.cStringUsingEncoding(NSUTF8StringEncoding)!
And I always got this error:
Cannot assign a value of type '[CChar]' to a value of type 'CChar'
I also check the answer in: UnsafeMutablePointer<Int8> from String in Swift
Above answer is slightly different from mine. The example above is for only one character, but I have a string. Also, I have to pass multiple arguments to the function, I can't use something like let result = "N".withCString { dgeev_(UnsafeMutablePointer($0), UnsafeMutablePointer($0), &N, ...) }. Please show me some example for how to complete this.
If the C function does not mutate the strings passed as arguments,
then the parameters should be declared as const char *
,
for example
int func1(const char *s1, const char *s2);
and in that case you can simply pass Swift strings which are automatically converted (compare String value to UnsafePointer<UInt8> function parameter behavior):
let str1 = "first string argument"
let str2 = "second string argument"
let result1 = func1(str1, str2)
If the function parameters are declared as char *
int func2(char *s1, char *s2);
then you have to use withCString()
to obtain a temporary representation
of the string as a NUL-terminated array of UTF-8 characters:
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))
}
}
Note that this still assumes that the function does not mutate the
passed strings, the UnsafeMutablePointer()
conversion is only
needed to make the compiler happy.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With