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字符串
基础教程推荐
- iOS4 创建后台定时器 2022-01-01
- navigator.geolocation.getCurrentPosition 在 Android 浏览器上 2022-01-01
- iPhone - 获取给定地点/时区的当前日期和时间并将其与同一地点的另一个日期/时间进行比较的正确方法 2022-01-01
- libGDX 从精灵或纹理中获取像素颜色 2022-01-01
- NSString intValue 不能用于检索电话号码 2022-01-01
- Android:getLastKnownLocation(LocationManager.NETWORK_PROVIDER 2022-01-01
- AdMob 广告未在模拟器中显示 2022-01-01
- 如何从 logcat 中删除旧数据? 2022-01-01
- 通过重定向链接在 Google Play 中打开应用 2022-01-01
- Cocos2d iPhone 非矩形精灵触摸检测 2022-01-01
