我有下面的代码,其中我的 Swift 代码调用 C++ 函数。在此,Swift 调用 C++ 函数并将 Swift
String
作为参数传递给它,然后在 C++ 代码中将其接收为 const char *
。此转换工作正常,没有任何错误。这是 C++-Swift 互操作性中记录的行为吗?使用安全吗?
迅捷的一面:
internal static func CharCheck (pSentence: String) -> Void {
TWSoundLogic.CharacterSoundCount (pSentence)
}
在C++方面,
void TWSoundLogic::CharacterSoundCount (const char * pSentence) {
..
}
但是,当从 Swift 函数返回
String
类型并尝试在 C++ 中将其作为 const char*
接收时,它会在 C++ 中给出错误。下面是代码。
没有从 'swift::String' 到 'const char *' 的可行转换
迅捷的一面:
internal static func CharCheck () -> String {
..
return sentence
}
在C++方面,
void TWSoundLogic::CharacterSoundCount (const char * pSentence) {
const char * cppsentence = swiftClass::CharCheck(); //error
}
为什么它不允许返回,但允许作为参数传递?有人可以解释这种行为吗?
Swift 使用多种不同的内部存储方法来存储 String 对象。我建议如下:
使用特定编码(如 UTF8)将字符串转换为
Data
。
将生成的
Data
(这是一个内存缓冲区)作为 Char * 传递给 C++。您需要计算出生成的内存的所有权。我还没有处理过 Swift 和 C++ 之间的互操作性,所以我不知道如何去做。我突然想到,给 Swift 一种方法,要求 C++ 分配(malloc)一个大小适合数据内容的缓冲区,然后将该数据转换为不安全的可变缓冲区并将数据复制到其中。一旦使用完毕,您的 C++ 代码就有责任释放 malloc 的缓冲区。
您的 C++ 代码需要编写以采用编码(例如 UTF8)