将std::字符串转换为SWIFT字符串

本教程将介绍将std::字符串转换为SWIFT字符串的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

将std::字符串转换为SWIFT字符串 教程 第1张

问题描述

简写:

怎么将std::string(由.cpp函数使用桥接从.SWIFT文件调用返回的对象)转换为SWIFTString

长版本:

我有一个用C++编写的库,我必须使用Swift调用一些代码。我创建了一个桥,在我的Xcode项目中添加了两个文件:

桥头,允许SWIFT调用C函数(AFAIK SWIFT不能直接调用C++函数,需要通过C函数传递)

//file bridgingHeader.h
const char * getLastOpenedFile();

和一个.cpp文件,它们(当然)可以在内部调用C++函数,并可以用外部"C"来定义C函数

//file wrapper.cpp 
#include <string>
#include "my_library.hpp"

extern "C" const char * getStringFromLibrary()
{
 const char * s = get_string_from_library().c_str();
 return s;
}

我可以使用

访问.wift文件中的返回值

let myString = String(cString: getStringFromLibrary())
Swift.print(myString)

在函数getStringFromLibrary()内放置断点以检查s的值我可以看到字符串的内容,因此可以正确调用库中的函数。

不管怎样,.swft文件会打印一些奇怪的符号,而不是原始字符串。
getStringFromLibrary()更改为以下

extern "C" const char * getStringFromLibrary()
{ return get_string_from_library().c_str();
}

我的结果是.swft代码打印了一个实际字符串的前缀。这让我想到了一个内存问题:可能当getStringFromLibrary()退出时,get_string_from_library()返回的std::string对象会被销毁,所以.c_str()返回的指针指向的内存不再可靠,这就是我从Swift.print()得到错误输出的原因。

从.swft文件访问std::string然后释放其内存的正确方法是什么?

推荐答案

您可以编写一个Objective-C++包装来使用C++代码。

桥接标头:

#include "Wrapper.hpp"

Wrapper.hpp:

#ifndef Wrapper_hpp
#define Wrapper_hpp

#import <Foundation/Foundation.h>

#if defined(__cplusplus)
extern "C" {
#endif
 NSString * _Nonnull getStringFromLibrary();
#if defined(__cplusplus)
}
#endif

#endif /* Wrapper_hpp */

包装器.mm:

#include "Wrapper.hpp"

#include <string>
#include "my_library.hpp"

NSString * _Nonnull getStringFromLibrary() {
 return [NSString stringWithUTF8String:get_string_from_library().c_str()];
}

SWIFT代码:

print(getStringFromLibrary())

[NSString stringWithUTF8String:]将缓冲区的内容复制到一些内部存储中,然后ARC会设法释放它。您无需定义free_something()

好了关于将std::字符串转换为SWIFT字符串的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。