在我的swift app项目中,我必须与C API进行交互。其中一个C函数将char指针作为输入,因此我必须将我的swift字符串转换为char指针。但我不知道如何正确地做到这一点。
这是我的示例代码:
var user_id_ptr : UnsafeMutablePointer<CChar> = UnsafeMutablePointer.alloc(100)
var cusID = "123"
user_id_ptr.memory = cusID.cStringUsingEncoding(NSUTF8StringEncoding)!
我总是遇到这个错误:
Cannot assign a value of type '[CChar]' to a value of type 'CChar'
我还会在UnsafeMutablePointer<Int8> from String in Swift
中查看答案以上回答与我的略有不同。 上面的例子只适用于一个字符,但我有一个字符串。另外,我必须向函数传递多个参数,我不能使用像let result =“N”.withCString {dgeev_(UnsafeMutablePointer($ 0),UnsafeMutablePointer($ 0),&amp; N,...)}之类的东西。请给我一些如何完成此事的示例。
答案 0 :(得分:10)
如果C函数没有改变作为参数传递的字符串,
那么参数应声明为const char *
,
例如
int func1(const char *s1, const char *s2);
在这种情况下,您只需传递自动转换的Swift字符串(比较String value to UnsafePointer<UInt8> function parameter behavior):
let str1 = "first string argument"
let str2 = "second string argument"
let result1 = func1(str1, str2)
如果函数参数声明为char *
int func2(char *s1, char *s2);
然后你必须使用withCString()
来获得临时表示
字符串作为NUL终止的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))
}
}
请注意,这仍假设该函数不会改变
传递字符串,仅UnsafeMutablePointer()
转换
需要让编译器满意。