将 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(声明和实现)(以创建类似解决方案的模板)。