Objective-C Language Conversion de C ++ std :: vector vers un tableau Objective-C


Exemple

De nombreuses bibliothèques C ++ utilisent des énumérations et renvoient / reçoivent des données à l'aide de vecteurs contenant des énumérations. Comme les énumérations C ne sont pas des objets Objective-C, les collections Objective-C ne peuvent pas être utilisées directement avec les énumérations C. L'exemple ci-dessous traite de cela en utilisant une combinaison de NSArray et de génériques et un objet wrapper pour le tableau. De cette manière, la collection peut être explicite sur le type de données et il n’ya pas de soucis concernant les fuites de mémoire possibles avec les tableaux C Les objets Objective-C sont utilisés.

Voici l'objet équivalent 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

Et voici une utilisation possible dans Objective-C ++ (le NSArray résultant peut être utilisé dans les fichiers Objective-C uniquement car aucun C ++ n'est utilisé).

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

Si ce type de solution doit être utilisé sur plusieurs énumérations, la création de EnumObj (déclaration et implémentation) peut être effectuée à l'aide d'une macro (pour créer un modèle comme une solution).