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.
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];