2010-10-08 3 views
2

У меня есть класс расстояние и ЬурейаЯ перечислимая Unit,Typedef перечисления 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; 
} 


} 

Где я объявляю мое перечисление Unit? Как получить доступ к

typedef enum{ 

    miles; 

    km; 

}Unit 

В другом классе я должен быть в состоянии назвать Distance.Unit.km или мили:

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

ответ

6

В C enum не делает его ценности «квалифицированное». У вас должен быть к нему доступ:

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

Похоже, вы пытаетесь сделать класс typedef, как вы можете, например, на C++. Я не помню, разрешено ли это в Objective-C, но это не так, как я буду делать это здесь. Я бы сохранил перечисление вне класса. Просто создайте еще один заголовочный файл с typedef. Хотя это своего рода тривиальный пример, могут быть другие применения для этого перечисления вне класса Distance, поэтому определите его вне.

Другая возможность, если это все, что вы используете для этого, состоит в том, чтобы иметь два инициализатора initWithMiles: и initWithKilometers:.

1

Objective-C не меняет смысл ключевых слов C. Он настроен на использование сообщений и объектов. Вы должны объявить enum до @interface. Я предлагаю вам следить за использованием JeffW initWithMiles: и initWithKilometers:, см. «Основы какао» для разработки методов.

Смежные вопросы