3 votes

Est-il possible d'étendre les enums à une classe en Objective-C ?

Je suis nouveau en Objective-C et j'essaie de comprendre les enums. Existe-t-il un moyen d'étendre un enum à une classe afin que les valeurs puissent être utilisées par une autre classe ? Quelque chose comme ceci :

@interface ClassA {
    typedef enum {
        ACCEPTED,
        REJECTED
    } ClassAStatus;
}
@end

@interface ClassB {
    typedef enum {
        ACCEPTED,
        REJECTED
    } ClassBStatus;
}
@end

Bien que cela ne fonctionne pas, évidemment. Ou existe-t-il une meilleure façon de faire les enums ?

Edit : Je suppose que ma formulation n'était pas claire, mais je ne demande pas comment déclarer les enums. Je suis conscient que les mettre en haut du fichier fonctionne. Je demande s'il y a un moyen de les étendre pour que les valeurs ne soient pas globales à tout le fichier.

6voto

DrummerB Points 22871

Vous devez préfixer vos enums publics. Il suffit de placer la définition de l'enum dans l'en-tête de votre classe.

// ClassA.h
typedef enum {
    ClassAStatusAccepted,
    ClassAStatusRejected
} ClassAStatus;

@interface ClassA {
    ClassAStatus status;
}
@end

// ClassB.h
typedef enum {
    ClassBStatusAccepted,
    ClassBStatusRejected
} ClassBStatus;

@interface ClassB {
    ClassBStatus status;
}
@end

C'est comme ça que fait Apple.

Ou vous pouvez utiliser le nouveau style :

// UIView.h
typedef NS_ENUM(NSInteger, UIViewAnimationCurve) {
    UIViewAnimationCurveEaseInOut,         // slow at beginning and end
    UIViewAnimationCurveEaseIn,            // slow at beginning
    UIViewAnimationCurveEaseOut,           // slow at end
    UIViewAnimationCurveLinear
};

3voto

woz Points 7765

Il suffit de mettre le enum en haut de votre fichier .h, comme le fait Apple dans UITableView.h, par exemple :

//
//  UITableView.h
//  UIKit
//
//  Copyright (c) 2005-2012, Apple Inc. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#import <UIKit/UIScrollView.h>
#import <UIKit/UISwipeGestureRecognizer.h>
#import <UIKit/UITableViewCell.h>
#import <UIKit/UIKitDefines.h>

typedef NS_ENUM(NSInteger, UITableViewStyle) {
    UITableViewStylePlain,                  // regular table view
    UITableViewStyleGrouped                 // preferences style table view
};

typedef NS_ENUM(NSInteger, UITableViewScrollPosition) {
    UITableViewScrollPositionNone,
    UITableViewScrollPositionTop,    
    UITableViewScrollPositionMiddle,   
    UITableViewScrollPositionBottom
};                // scroll so row of interest is completely visible at top/center/bottom of view

typedef NS_ENUM(NSInteger, UITableViewRowAnimation) {
    UITableViewRowAnimationFade,
    UITableViewRowAnimationRight,           // slide in from right (or out to right)
    UITableViewRowAnimationLeft,
    UITableViewRowAnimationTop,
    UITableViewRowAnimationBottom,
    UITableViewRowAnimationNone,            // available in iOS 3.0
    UITableViewRowAnimationMiddle,          // available in iOS 3.2.  attempts to keep cell centered in the space it will/did occupy
    UITableViewRowAnimationAutomatic = 100  // available in iOS 5.0.  chooses an appropriate animation style for you
};

Vous reconnaissez probablement certains de ces noms, mais vous n'étiez peut-être pas au courant qu'ils faisaient partie d'un programme public de lutte contre la pauvreté. enum dans les fichiers d'en-tête d'Apple.

2voto

Fredrik Johansson Points 691

Je veux juste ajouter à la réponse de @DrummerB que j'écris habituellement comme ceci. L'espace de nom en camelCase, puis la constante en majuscule.

typedef enum {
    ClassAStatus_ACCEPTED,
    ClassAStatus_REJECTED
} ClassAStatus;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X