将std::字符串转换为SWIFT字符串 [英] convert an std::string to a Swift String

查看:32
本文介绍了将std::字符串转换为SWIFT字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

简写:

如何将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字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆