在我的 iOS 專案中,我想從我的 Swift 代碼中呼叫一個 C 函式,該函式從我的 Swift 代碼中獲取一個物件并回傳另一個物件。
到目前為止,按照本教程并添加了更多內容,我設法呼叫了一個 C 函式,該函式接受一個簡單的引數并回傳一個字串:
- 我創建
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 函式:
NativeLibWrapper().sayHello(true)
但是現在,假設我的 C sayHello()函式將這種物件作為引數(所以我可以在 C 函式中訪問它):
class TestAPOJO {
var value1 = ""
var value2 = false
}
并回傳這種物件(從 C 函式生成,然后映射到 Swift 物件,或類似的東西):
class TestBPOJO {
var value3 = 0.0
var value4 = false
}
我怎樣才能做到這一點?
謝謝。
uj5u.com熱心網友回復:
好的,這就是我為使其作業所做的作業:
- 創建 Objective-C
TestAPOJO和TestBPOJO類:
// TestAPOJO.h:
#import <Foundation/Foundation.h>
@interface TestAPOJO : NSObject
@property NSString *value1;
@property bool value2;
@end
// TestAPOJO.mm:
#import "TestAPOJO"
@implementation TestAPOJO
@end
- 創建 C
TestAPOJOFromC和TestBPOJOFromC類:
// 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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/434854.html
上一篇:如何將Objective-C浮點*轉換為Swift?
下一篇:CorePlot“indexOfVisiblePointClosestToPlotAreaPoint”給我錯誤的索引
