繁体   English   中英

如何将 object 传递和返回到从 iOS Swift 调用的 C++ function?

[英]How to pass and return an object to a C++ function called from iOS Swift?

在我的 iOS 项目中,我想从我的 Swift 代码中调用一个 C++ function,它从我的 Swift 代码中获取一个 object 并返回另一个 object。

到目前为止,按照本教程并添加更多内容,我成功地调用了一个 C++ function,它采用一个简单的参数并返回一个字符串:

  • 我创建NativeLibWrapper.h文件:
#import <Foundation/Foundation.h>

@interface NativeLibWrapper : NSObject

- (NSString *) sayHello: (bool) boolTest;

@end

  • 我创建NativeLibWrapper.mm文件:
#import <Foundation/Foundation.h>

#import "NativeLibWrapper.h"
#import "NativeLib.hpp"

@implementation NativeLibWrapper

- (NSString *) sayHello: (bool) boolTest {
    NativeLib nativeLib;
    std::string retour = nativeLib.sayHello(boolTest);
    return [NSString stringWithCString: retour.c_str() encoding: NSUTF8StringEncoding];
}

@end
  • 我创建了NativeLib.hpp文件:

#ifndef NativeLib_hpp
#define NativeLib_hpp

#include <stdio.h>
#include <string>

class NativeLib
{
public:
    std::string sayHello(bool boolTest);
};

#endif /* NativeLib_hpp */

  • 我创建NativeLib.cpp文件:
#include "NativeLib.hpp"

std::string NativeLib::sayHello(bool boolTest)
{
    return "Hello C++ : " + std::to_string(boolTest);
}
  • 我在Runner/Runner/Runner-Bridging-Header.h中添加以下内容:
#import "NativeLibWrapper.h"
  • 最后,我在 Swift 中调用 C++ function:
NativeLibWrapper().sayHello(true)

但是现在,假设我的 C++ sayHello() function 将这种 object 作为参数(这样我就可以在 C++ 函数中访问它):

class TestAPOJO {

    var value1 = ""
    var value2 = false
}

并返回这种 object(从 C++ function 生成,然后映射到 Swift object,或类似的东西):

class TestBPOJO {

    var value3 = 0.0
    var value4 = false
}

我怎样才能做到这一点?

谢谢。

好的,这就是我为使其工作所做的工作:

  • 创建 Objective-C TestAPOJOTestBPOJO类:
// TestAPOJO.h:

#import <Foundation/Foundation.h>

@interface TestAPOJO : NSObject

@property NSString *value1;
@property bool value2;

@end


// TestAPOJO.mm:

#import "TestAPOJO"

@implementation TestAPOJO

@end
  • 创建 C++ TestAPOJOFromCTestBPOJOFromC类:
// TestAPOJOFromC.hpp:

#ifndef TestAPOJOFromC_hpp
#define TestAPOJOFromC_hpp

class TestAPOJOFromC
{
public:
    TestAPOJOFromC();
    ~TestAPOJOFromC();
    
    std::string value1;
    bool value2;
};

#endif /* TestAPOJOFromC_hpp */


// TestBPOJOFromC.cpp:

#include "TestBPOJOFromC.hpp"

TestBPOJOFromC::TestBPOJOFromC()
{
    value1 = "";
    value2 = false;
}

TestBPOJOFromC::~TestBPOJOFromC() = default;

  • NativeLibWrapper.h文件中,添加:

- (TestBPOJO *) getTestPOJOS: (TestAPOJO *) testAPOJO;

  • NativeLibWrapper.mm文件中,添加:
- (TestBPOJO *) getTestPOJOS: (TestAPOJO *) testAPOJO {
    NativeLib nativeLib;
    TestAPOJOFromC *testAPOJOFromC = new TestAPOJOFromC();
    testAPOJOFromC->value1 = std::string([testAPOJO.value1 UTF8String]);
    testAPOJOFromC->value2 = testAPOJO.value2;
    TestBPOJOFromC * testBPOJOFromC = nativeLib.getTestPOJOS(testAPOJOFromC);

    TestBPOJO *testBPOJO = [TestBPOJO new];
    testBPOJO.value3 = testBPOJOFromC->value3;
    testBPOJO.value4 = testBPOJOFromC->value4;
    return testBPOJO;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM