将Swift字符串转换为CChar指针

时间:2015-07-13 07:57:35

标签: c swift pointers

在我的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,...)}之类的东西。请给我一些如何完成此事的示例。

1 个答案:

答案 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()转换 需要让编译器满意。