在我的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)!
Run Code Online (Sandbox Code Playgroud)
我总是遇到这个错误:
Cannot assign a value of type '[CChar]' to a value of type 'CChar'
我还检查了答案:Swift中的String中的UnsafeMutablePointer <Int8>
以上答案与我的略有不同.上面的例子只适用于一个字符,但我有一个字符串.另外,我必须向函数传递多个参数,我不能使用像let result ="N".withCString {dgeev_(UnsafeMutablePointer($ 0),UnsafeMutablePointer($ 0),&N,...)}之类的东西.请给我一些如何完成此操作的示例.
Mar*_*n R 10
如果C函数没有改变作为参数传递的字符串,那么参数应该被声明为const char *,例如
int func1(const char *s1, const char *s2);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可以简单地传递自动转换的Swift字符串(将String值与UnsafePointer <UInt8>函数参数行为进行比较):
let str1 = "first string argument"
let str2 = "second string argument"
let result1 = func1(str1, str2)
Run Code Online (Sandbox Code Playgroud)
如果函数参数声明为 char *
int func2(char *s1, char *s2);
Run Code Online (Sandbox Code Playgroud)
那么你必须使用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))
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这仍然假设函数不会改变传递的字符串,UnsafeMutablePointer()只需要转换就可以使编译器满意.
| 归档时间: |
|
| 查看次数: |
3281 次 |
| 最近记录: |