2015-07-13 41 views
3

在我的swift应用程序项目中,我必须与C API进行交互。其中一个C函数将char指针作为输入,因此我必须将我的swift字符串转换为char指针。但我不知道如何正确地做到这一点。将Swift字符串转换为CChar指针

这里是我的示例代码:

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),& N,...)}之类的东西。请给我演示一下如何完成这个例子。

+1

取决于C函数是采用'char *'还是'const char *',要么是http://stackoverflow.com/questions/27876179/unsafemutablepointerint8-from-string-in-swift或http:// stackoverflow.com/questions/27063569/string-value-to-unsafepointeruint8-function-parameter-behavior应该解决你的问题。 –

+0

感谢您的回答,但我仍然有一些问题。 u post的例子只有一个字符,但我有一个字符串。此外,我必须传递多个参数给函数,我不能使用'let result =“N”.withCString {UnsafeMutablePointer($ 0),UnsafeMutablePointer($ 0),&N,...)012ge} '。请给我演示一下如何完成这个例子。 –

+0

相同的技术适用于(多个)字符串,但为了您的方便,我添加了它作为答案:) –

回答

8

如果C函数没有发生变异作为参数传递的字符串, 那么参数应该声明为const char *, 例如

int func1(const char *s1, const char *s2); 

,并在这种情况下,你可以简单地传递斯威夫特的字符串,其自动转换(比较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()获得字符串作为UTF-8字符的NUL终止阵列的暂时表示 :

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()转换只有 需要使编译器开心。

+0

谢谢,它的工作原理 –