2010-10-08 4 views
2

je Distance de classe et typedef Unité enum,Typedef ENUM Objective-C

@interface Distance:NSObject{ 

double m_miles; 

} 

@property double m_miles; 

-(Distance *) initWithDistance: (double) value andUnit:(Unit) unit; 

@implementation Distance 

-(Distance *)initWithDistance: (double) value andUnit:(Unit) unit{ 

    self = [super init]; 

if (self){ 

    switch (unit) { 

    case Unit.miles: m_miles = value; 

         break; 

    case Unit.km:  m_miles = value/1.609344; 

         break; 
} 


} 

Où dois-je déclarer mon unité de ENUM? Comment accéder

typedef enum{ 

    miles; 

    km; 

}Unit 

Dans l'autre classe, je devrais être en mesure d'appeler ou Distance.Unit.km miles:

Distance *a = [[Distance alloc] initWithDistance: 10.2 andUnit: Distance.Unit.km]; 

Répondre

6

En C un enum n'a pas fait ses valeurs « qualifiées ». Vous devez y accéder avec

Distance *a = [[Distance alloc] initWithDistance: 10.2 andUnit:km]; 
//                ^^ 
//                no Distance.Unit.stuff 
2

Il semble que vous essayiez de faire un typedef de classe comme vous pouvez le dire en C++. Je ne me souviens pas si cela est même autorisé en Objective-C mais ce n'est pas comme ça que je le ferais ici de toute façon. Je garderais l'énumération en dehors de la classe. Créez simplement un autre fichier d'en-tête avec le typedef. Bien que ce soit un exemple trivial, il peut y avoir d'autres utilisations pour cette énumération en dehors de la classe Distance, donc définissez-la à l'extérieur.

Une autre possibilité, si c'est tout ce que vous utilisez pour cela est d'avoir deux initialiseurs initWithMiles: et initWithKilometers:.

1

Objective-C ne modifie pas le sens des mots-clés C. Il est configuré pour utiliser les messages et les objets. Vous devez déclarer enum avant @interface. Je vous suggère de suivre JeffW utiliser initWithMiles: et initWithKilometers:, voir les principes fondamentaux du cacao pour savoir comment concevoir des méthodes.