C 从常量字符*转换为Swift字符串

C 从常量字符*转换为Swift字符串,c,swift,C,Swift,我有一个c函数,我从桥接头访问它,该桥接头返回一个常量char*: const char* get_c_string(); 然后我尝试将其转换为Swift字符串: let str = String.fromCString(UnsafePointer<Int8>(get_c_string())) print(str) 我可以找到如何将Swift字符串传递给C,但不能找到相反的方法。如何将常量字符*转换为Swift字符串 谢谢 您的Swift代码是正确的,您可以将其稍微缩短为 //

我有一个c函数,我从桥接头访问它,该桥接头返回一个
常量char*

const char* get_c_string();
然后我尝试将其转换为Swift字符串:

let str = String.fromCString(UnsafePointer<Int8>(get_c_string()))
print(str)
我可以找到如何将Swift字符串传递给C,但不能找到相反的方法。如何将
常量字符*
转换为Swift字符串


谢谢

您的Swift代码是正确的,您可以将其稍微缩短为

// Swift 2:
let str = String.fromCString(get_c_string())
// Swift 3:
let str = String(cString: get_c_string())
但是,必须确保从C函数返回的指针 在函数返回时仍然有效。例如

const char* get_c_string() {
    char s[] = "abc";
    return s;
}
返回本地堆栈变量的地址,该变量是未定义的行为

您可能需要复制字符串(然后考虑何时复制)
这个字符串有特殊的字符吗?不,它只是一个标准的
const char*
c字符串(来自
std::string
),在您的示例中有两个不同的函数
get_c_string
call_hi
。除此之外,您的转换方法也应该有效。请注意,指针转换不是必需的:
let str=String.fromCString(get_c_String())
.typo-调用与原型匹配,因此我调用了正确的函数。这看起来像是一个编码问题,但不确定是什么。可能get_c_string()返回局部变量的内容(当函数返回时,该变量将变得无效)?必须确保返回的指针在函数返回时仍然有效(例如malloc memory或strdup字符串)。您的Swift代码正确。此API用法不再是最新的。编译器报告:“请使用String。init(ValueAutoTut8:))。注意它不再接受NULL作为一个有效的输入。也考虑使用String(cString::),它将尝试修复不正确的代码单元。@ @ StaveOver:上面的代码仍然没有警告或错误编译,而XCODE7.3/SWIFT 2.2是当前发布版本。API在Swift 3中似乎发生了变化,所以我必须在正式发布后更新答案。我希望这就是我遇到的问题,但我认为不是。如果你在这里有类似的见解,我想听听你的想法:
const char* get_c_string() {
    char s[] = "abc";
    return s;
}