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字符串
基础教程推荐
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01