EnumCzęść NR.4Kolejny wpis z cyklu z C# do Objective-C.

Szybko omówię jak stworzyć typ wyliczeniowy w Objective-C na podstawie przykładów z C#. Jakie są różnicę? Na pewno tym razem oba języki nie wykazują żadnych podobieństw.

 

public enum MarginDirection
{
    Left,
    Right,
    Up,
    Down
}

W C# numeracja typu wyliczeniowego jest opcjonalna podobnie jest w Objective-C. Pierwszemu elementowi będzie odpowiadał wartości 0 jeśli nie nadano mu innej wartości poprzez jawne przypisanie w definicji.

Deklaracje typy wyliczeniowego powinna znajdować się w header-ze (.h) nie w pliku implementacyjnym (.m).

typedef enum
{
   Left = 0,
   Right,
   Up,
   Down
} MarginDirection;

W Objective-C przy pomocy tej składni deklarujemy  dwie  rzeczy. Typ “MarginDirection” jest deklarowany jako anonimowy typ wyliczeniowy.

Left,Right,Up,Down są deklarowane jako stałe liczbowe.

Nie będę kłamał  ciężko tutaj o porównanie Objective-C do C# gdyż mechanizm ten ma więcej sensu  z językiem C od którego ten mechanizm się wywodzi .

Oto zastosowanie typu wyliczeniowego w C# jako właściwości klasy.

public class UseMargin
{
    public MarginDirection Direction { get; set; }
}
UseMargin um = new UseMargin();
um.Direction = MarginDirection.Left;

W Objective-C sprawa wygląda tak.

@interface MyOtherObject : NSObject

@property(nonatomic,assign) MarginDirection direction;

@end

Skoro “Left” jest tak naprawdę stałą przechowującą liczbę “0” nie musimy tak jak w C# wcześniej pisać nazwy danego typu wyliczeniowego (MarginDirection).

MyOtherObject* myaa = [[MyOtherObject alloc] init];
myaa.direction = Left;

W C# możemy łatwo wyświetlić wartość nazwy typu wyliczeniowy jako napis string.

Enum to string

W Objective-C wymaga to napisania własnej metody gdyż tak jak mówiłem wcześniej Left,Right i tak dalej są tak naprawdę stałymi liczbowymi.

- (NSString*)formatTypeToString:(MarginDirection)formatType {
    NSString *result = nil;
    
    switch(formatType) {
        case Left:
            result = @"Left";
            break;
        case Right:
            result = @"Right";
            break;
        case Up:
            result = @"Up";
            break;
        case Down:
            result = @"Down";
            break;
        default:
            [NSException raise:
		NSGenericException format:
		@"Unexpected FormatType."];
    }
    
    return result;
}

@end

Alternatywnie możesz utworzyć tablicę stałych string, których indeksy nakładają się z wartościami liczbowymi danego typu wyliczeniowego.

NSString * const MarginDirection_toString[];

// In a source file
NSString * const MarginDirectione_toString[] = {
  @"Lefy",
  @"Right",
  @"Up",
  @"Down"
};
...
// To convert enum to string:
NSString *str = MarginDirection_toString[theEnumValue];