gpt4 book ai didi

ios - 将 C++ 类的引用传递给 Objective C 接口(interface)

转载 作者:行者123 更新时间:2023-11-30 13:25:09 24 4
gpt4 key购买 nike

我编写了一个 Objective C++ 包装器,以便我能够在 Swift 中访问 C++ 方法。

包装器有一个返回 C++ 类引用的方法。

IECMServices.h(C++ 类)

namespace ECMServices
{
class IECMServices
{
public:
virtual DataServices::IParameters& getDeviceInformation(ECMServicesTypes::UINT_16 moduleID) = 0;

};
}

IECMServicesWrapper.mm (Objective C++ class)

我在编写包装器代码时遇到上述错误。

IParameters 是一个 C++ 类OParameters 是 IParameters 的 Objective C++ 等效类

我想将 OParameters 的引用返回给 Swift。为此,我想将 C++ 类的引用传递给我的 oParametersRef

oParametersRef = oCECMServicesProviderObj.getECMServices().getDeviceInformation(0);

"oCECMServicesProviderObj.getECMServices().getDeviceInformation(0);"

这将返回 IParameters 的引用,它是一个 C++ 类。

这样我就可以通过OParameters(Objective C++)快速访问IParameters(C++)的方法

我想将 C++ 的引用传递给 Objective C++Swift

最佳答案

搜索这个社区网站,有很多解决这个问题的答案。例如,参见:How to use Superpowered lib in Swift project

图像中的具体错误消息是由于 getDeviceInformation() 返回对 IParameters 的引用,该引用被分配给不兼容的类型 OParameters *,即指向OParameters的指针。未给出 OParameters 的代码,但我猜想将 IParameters 引用转换为 OParameters 指针会很棘手且不必要。无论如何,您的 OParameters 类显然不提供这样的转换。

正如您在上述答案中看到的,不可能将 C++ 代码直接暴露给 Swift,而 IParameters 是一个 C++ 类。 Objective-C++ 允许您混合 Objective-C 和 C++,但只有代码的 Objective-C 部分可以通过 header 暴露给 Swift。因此,您需要创建一个 Objective-C 类,该类根据 IParameters 实例的内容进行填充并返回到 Swift。此外,如果您希望在 Swift 中所做的更改在 C++ 中可见,则需要在包装器 .mm 文件中保留对 IParameters 的指针或引用,但是不在 Swift 可见的任何 header 中,并且具有 Swift 可见的 setter ,可用于修改 IParameters 状态。

这是一个简单而肮脏的例子。这里的重点只是在 C++ 和 Swift 之间共享 IParams。内存管理之类的事情超出了这里的范围。为简单起见,我们假设我们的 IParamsEMC C++ 类如下所示:

class IParams {
public:
int32_t param1;
int32_t param2;
};

class ECM
{
public:
static ECM * getInstance();
// It's very important that a reference is returned here. This
// allows us to store the pointer to the referenced IParams in a
// member of OParams, and the OParams' getters and setters can then
// directly access the IParams object returned here by reference.
IParams& getDeviceInfo();
...
};

下面是它们在 Objective-C++ (.mm) 代码中的包装器实现,它直接引用 C++ 代码,但没关系,因为它对 Swift 是隐藏的:

@implementation OParams
{
IParams * pIParams;
}

-(id)init:(IParams*)pip
{
pIParams = pip;
return self;
}

// These getters and setters directly access the memory of the IParams
// object pointed to by pIParams.
-(int32_t)getParam1 { return pIParams->param1; }
-(int32_t)getParam2 { return pIParams->param2; }
-(void)setParam1:(int32_t)p { pIParams->param1 = p; }
-(void)setParam2:(int32_t)p { pIParams->param2 = p; }

@end

@implementation ECMWrapper

-(OParams*)getDeviceInfo
{
// We're returning a pointer to an OParams instance whose pIParams
// member points to the IParams object the reference to which is
// returned from ECM::getDeviceInfo()
return [[OParams alloc] init:(&ECM::getInstance()->getDeviceInfo())];
}

@end

最后,以下是 Swift 通过桥接 header 直接或间接可见的声明:

@interface OParams : NSObject

-(int32_t)getParam1;
-(int32_t)getParam2;
-(void)setParam1:(int32_t)p;
-(void)setParam2:(int32_t)p;

@end

@interface ECMWrapper : NSObject

-(OParams*)getDeviceInfo;

@end

请注意,此处未提及 C++ 类型或方法,因此此代码可以在 Swift 中使用。

关于ios - 将 C++ 类的引用传递给 Objective C 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37308119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com