convert an std::string to a Swift String(将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
的值我可以看到字符串的内容,因此可以正确调用库中的函数。
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字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:将std::字符串转换为SWIFT字符串
- Android viewpager检测滑动超出范围 2022-01-01
- 使用自定义动画时在 iOS9 上忽略 edgesForExtendedLayout 2022-01-01
- android 4中的android RadioButton问题 2022-01-01
- Android - 拆分 Drawable 2022-01-01
- MalformedJsonException:在第1行第1列路径中使用JsonReader.setLenient(True)接受格式错误的JSON 2022-01-01
- 想使用ViewPager,无法识别android.support.*? 2022-01-01
- 如何检查发送到 Android 应用程序的 Firebase 消息的传递状态? 2022-01-01
- Android - 我如何找出用户有多少未读电子邮件? 2022-01-01
- 在测试浓缩咖啡时,Android设备不会在屏幕上启动活动 2022-01-01
- 用 Swift 实现 UITextFieldDelegate 2022-01-01