如何隐藏一个c++;枚举向量到等效的目标C数组/向量? 我在iOS应用程序上使用C++库。其中一个函数为我提供了一个包含C枚举的std::vector。我希望在Objective C(而不是ObjectC++)中使用此数据,因此需要将此数组转换为等效的Objective C数据结构。我使用桥接类将C++转换成目标C./P>

如何隐藏一个c++;枚举向量到等效的目标C数组/向量? 我在iOS应用程序上使用C++库。其中一个函数为我提供了一个包含C枚举的std::vector。我希望在Objective C(而不是ObjectC++)中使用此数据,因此需要将此数组转换为等效的Objective C数据结构。我使用桥接类将C++转换成目标C./P>,c++,ios,objective-c,arrays,enums,C++,Ios,Objective C,Arrays,Enums,我的代码看起来有点像: typedef enum { Error0 = 0, Error1 = 1, Error2 = 2 } MyError; class ListenerImpl : public Listener { public: ListenerImpl(Listener* listener) : _listener(listener) {} void onError(std::vector<MyError> errors) overri

我的代码看起来有点像:

typedef enum 
{  
  Error0 = 0,
  Error1 = 1,
  Error2 = 2
} MyError;

class ListenerImpl : public Listener
{
public:
    ListenerImpl(Listener* listener) : _listener(listener) {}
    void onError(std::vector<MyError> errors) override
    {
        // Calling Objective C listener (listener class should not be using Objective C++)
        [_listener onError:convertToObjC(errors)];
    }

    void handleError(MyError error, int someExtraData) {
        // Error values are returned back to C++ so if any mapping is to be used it needs to be bi-directional.
    }
private:

    // The question is how to implement this function and what is a good return value here.
    ArrayRetValue convertToObjC(std::vector<MyError> & errors) 
    { 
        // Not sure how to accomplish this
    }
    __weak Listener* _listener;
}
typedef枚举
{  
错误0=0,
错误1=1,
错误2=2
}迈罗;
类ListenerImpl:公共侦听器
{
公众:
ListenerImpl(Listener*Listener):\u Listener(Listener){}
无效onError(标准::矢量错误)覆盖
{
//调用Objective C listener(listener类不应使用Objective C++)
[_listener-onError:convertToObjC(错误)];
}
void handleError(MyError错误,int-someExtraData){
//错误值返回到C++,因此如果使用任何映射,则需要双向。
}
私人:
//问题是如何实现这个函数,以及什么是好的返回值。
ArrayRetValue转换器到BJC(标准::向量和错误)
{ 
//我不知道如何做到这一点
}
__弱倾听者*\u倾听者;
}
我的问题是:如何以可维护的方式实现此功能?在.h文件中:

#if __OBJC__
typedef NSArray *ArrayRetValue;
#else
typedef void *ArrayRetValue;
#endif
in .mm文件(需要混合C++和Obj-C代码):

NSMutableArray*ListenerImpl::convertToObjC(std::vector&errors)
{
NSMUTABLEARRY*objCErrors=[NSMUTABLEARRY阵列容量:errors.size()];
用于(自动错误:错误){
[objCErrors addObject:[NSNumber NUMBER WITHIT:error]];
}
返回错误;
}

也需要将代码>错误-< /Co>函数移到.mm文件,否则你将不能在C++代码中使用这个类。

经过仔细考虑,我决定使用NSART和泛型的组合。通过这种方式,我可以明确地了解数据,并且在使用Objective-C对象时,我不必担心C数组可能出现的内存泄漏

为了实现这一点,我必须为我的C枚举创建一个Objective-C等效对象(因为NSArray需要一个类型)。因此,我创建了
ErrorEnumObj

以下是完整的解决方案:

typedef enum 
{  
  Error0 = 0,
  Error1 = 1,
  Error2 = 2
} MyError;

@interface ErrorEnumObj : NSObject

@property (nonatomic) int intValue;

+ (instancetype) objWithEnum:(MyError) myError;
- (MyError) getEnumValue;

@end 

@implementation ErrorEnumObj

+ (instancetype) objWithEnum:(MyError) error
{
    ErrorEnumObj * obj = [ErrorEnumObj new];
    obj.intValue = (int)error;
    return obj;
}

- (MyError) getEnumValue
{
    return (MyError)self.intValue;
}

@end

class ListenerImpl : public Listener
{
public:
    ListenerImpl(Listener* listener) : _listener(listener) {}
    void onError(std::vector<MyError> errors) override
    {
        NSMutableArray<ErrorEnumObj *> * array = [NSMutableArray<ErrorEnumObj *> new]; 
        for (auto&& myError : errors)
        {
            [array addObject:[ErrorEnumObj objWithEnum:myError]];
        }
        [_listener onError:array];
    }

private:
    __weak Listener* _listener;
}
typedef枚举
{  
错误0=0,
错误1=1,
错误2=2
}迈罗;
@接口错误EnumObj:NSObject
@属性(非原子)int值;
+(instancetype)objWithEnum:(MyError)MyError;
-(MyError)getEnumValue;
@结束
@实现错误枚举对象
+(instancetype)objWithEnum:(MyError)错误
{
ErrorEnumObj*obj=[ErrorEnumObj新建];
obj.intValue=(int)错误;
返回obj;
}
-(MyError)getEnumValue
{
返回(MyError)self.intValue;
}
@结束
类ListenerImpl:公共侦听器
{
公众:
ListenerImpl(Listener*Listener):\u Listener(Listener){}
无效onError(标准::矢量错误)覆盖
{
NSMUTABLEARRY*数组=[NSMUTABLEARRY new];
用于(自动(&M)错误:错误)
{
[array addObject:[ErrorEnumObj objWithEnum:myError];
}
[_listeneronerror:array];
}
私人:
__弱倾听者*\u倾听者;
}

如果要在多个枚举上使用这种解决方案,则可以使用宏创建EnumObj(声明和实现)(以创建类似模板的解决方案)。

ArrayRetValue的接口是什么??这是问题的一部分。我不确定什么是合适的。这个解决方案的问题是,每当我使用数组时,我都必须将NSNumber强制转换回enum(例如在开关情况下)。此外,数组的内容仅是MyError值这一点并不明确。
typedef enum 
{  
  Error0 = 0,
  Error1 = 1,
  Error2 = 2
} MyError;

@interface ErrorEnumObj : NSObject

@property (nonatomic) int intValue;

+ (instancetype) objWithEnum:(MyError) myError;
- (MyError) getEnumValue;

@end 

@implementation ErrorEnumObj

+ (instancetype) objWithEnum:(MyError) error
{
    ErrorEnumObj * obj = [ErrorEnumObj new];
    obj.intValue = (int)error;
    return obj;
}

- (MyError) getEnumValue
{
    return (MyError)self.intValue;
}

@end

class ListenerImpl : public Listener
{
public:
    ListenerImpl(Listener* listener) : _listener(listener) {}
    void onError(std::vector<MyError> errors) override
    {
        NSMutableArray<ErrorEnumObj *> * array = [NSMutableArray<ErrorEnumObj *> new]; 
        for (auto&& myError : errors)
        {
            [array addObject:[ErrorEnumObj objWithEnum:myError]];
        }
        [_listener onError:array];
    }

private:
    __weak Listener* _listener;
}