将 Swift 中的“String”类型转换为 C++ 中的“const char *”

问题描述 投票:0回答:1

我有下面的代码,其中我的 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
}

为什么它不允许返回,但允许作为参数传递?有人可以解释这种行为吗?

c++ swift interop
1个回答
0
投票

Swift 使用多种不同的内部存储方法来存储 String 对象。我建议如下:

使用特定编码(如 UTF8)将字符串转换为

Data

将生成的

Data
(这是一个内存缓冲区)作为 Char * 传递给 C++。您需要计算出生成的内存的所有权。我还没有处理过 Swift 和 C++ 之间的互操作性,所以我不知道如何去做。我突然想到,给 Swift 一种方法,要求 C++ 分配(malloc)一个大小适合数据内容的缓冲区,然后将该数据转换为不安全的可变缓冲区并将数据复制到其中。一旦使用完毕,您的 C++ 代码就有责任释放 malloc 的缓冲区。

您的 C++ 代码需要编写以采用编码(例如 UTF8)

© www.soinside.com 2019 - 2024. All rights reserved.