将 C stdvectorEnum 转换为 Objective-C 数组

许多 C++库使用枚举并使用包含枚举的向量返回/接收数据。由于 C 枚举不是 Objective-C 对象,因此 Objective-C 集合不能直接与 C 枚举一起使用。下面的示例通过使用 NSArray 和泛型的组合以及数组的包装器对象来处理此问题。这样,集合可以是关于数据类型的显式,并且不用担心使用 C 数组可能的内存泄漏使用 Objective-C 对象。

这是 C enum 和 Objective-C 等效对象:

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

这里可以在 Objective-C++中使用它(由于没有使用 C++,因此生成的 NSArray 可以在 Objective-C 文件中使用)。

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;
}

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