Nie sądzę, że zasadniczo rozumiem, co to enum
jest i kiedy go używać.
Na przykład:
typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
Co tak naprawdę deklaruje się tutaj?
objective-c
enums
typedef
Craig
źródło
źródło
Odpowiedzi:
Trzy rzeczy są deklarowane są tutaj: anonimowy typ wyliczeniowy jest deklarowana,
ShapeType
jest ogłoszony typedef dla tego anonimowe wyliczanie, a trzy nazwykCircle
,kRectangle
ikOblateSpheroid
zostały zadeklarowane jako integralne stałych.Rozwalmy to. W najprostszym przypadku wyliczenie można zadeklarować jako
To deklaruje wyliczenie ze znacznikiem
tagname
. W C i Objective-C (ale nie w C ++) wszelkie odniesienia do tego muszą być poprzedzoneenum
słowem kluczowym. Na przykład:Aby uniknąć konieczności używania
enum
słowa kluczowego w dowolnym miejscu, można utworzyć typedef:Można to uprościć w jednym wierszu:
I wreszcie, jeśli nie potrzebujemy, aby móc korzystać
enum tagname
zenum
hasła, możemy dokonaćenum
anonimowy i tylko zadeklarować ją z nazwą typedef:Teraz w tym przypadku deklarujemy, że jesteśmy
ShapeType
anonimowym wyliczeniem na maszynie.ShapeType
jest naprawdę tylko integralną typu i powinny być wykorzystywane jedynie zadeklarować zmienne, które posiadają jedną z wartości wymienionych w deklaracji (czyli jedenkCircle
,kRectangle
ikOblateSpheroid
). Możesz jednak przypisaćShapeType
zmienną inną wartość poprzez rzutowanie, więc musisz zachować ostrożność podczas odczytywania wartości wyliczeniowych.Wreszcie
kCircle
,kRectangle
ikOblateSpheroid
zostały zadeklarowane jako integralne stałe w globalnej przestrzeni nazw. Ponieważ nie określono żadnych konkretnych wartości, są one przypisywane do kolejnych liczb całkowitych rozpoczynających się od 0, więckCircle
wynosi 0,kRectangle
wynosi 1 ikOblateSpheroid
wynosi 2.źródło
Apple zaleca zdefiniowanie takich wyliczeń od Xcode 4.4 :
Zapewniają również przydatne makro
NS_ENUM
:Te definicje zapewniają silniejsze sprawdzanie typów i lepsze uzupełnianie kodu. Nie mogłem znaleźć oficjalnej dokumentacji
NS_ENUM
, ale możesz obejrzeć film „Modern Objective-C” z sesji WWDC 2012 tutaj .AKTUALIZACJA
Link do oficjalnej dokumentacji tutaj .
źródło
NS_ENUM
makra Apple'a przez NSHipster: NSHipster.com/ns_enum-ns_optionsWyliczenie deklaruje zestaw uporządkowanych wartości - typedef po prostu dodaje do tego poręczną nazwę. Pierwszy element to 0 itd.
Powyższe jest tylko wyliczeniem znaczników shapeType.
źródło
Użytkownik definiuje typ, który ma możliwych wartości
kCircle
,kRectangle
lubkOblateSpheroid
. Jednak wartości w wyliczeniu (kCircle itp.) Są widoczne poza wyliczeniem. Ważne jest, aby o tym pamiętać (int i = kCircle;
na przykład obowiązuje).źródło
Aktualizacja dotycząca zmiany 64-bitowej: Według dokumentów Apple na temat zmian 64-bitowych,
Więc musisz utworzyć wyliczenie z typem jak poniżej składni, jeśli obsługujesz 64-bit.
lub
W przeciwnym razie doprowadzi to do ostrzeżenia jako
Implicit conversion loses integer precision: NSUInteger (aka 'unsigned long') to ShapeType
Aktualizacja do szybkiego programowania:
W krótkim czasie następuje zmiana składni.
źródło
Wyliczenie (skrót wyliczenia) służy do wyliczenia zestawu wartości (podmiotów wyliczających). Wartość jest abstrakcyjną rzeczą reprezentowaną przez symbol (słowo). Na przykład podstawowym wyliczeniem może być
Ten wylicznik nazywa się anonimowy, ponieważ nie masz symbolu, który mógłby go nazwać. Ale nadal jest całkowicie poprawne. Po prostu użyj tego w ten sposób
Ok. Życie jest piękne i wszystko idzie dobrze. Ale pewnego dnia musisz ponownie użyć tego wyliczenia, aby zdefiniować nową zmienną do przechowywania myGrandFatherPantSize, a następnie piszesz:
Ale wtedy pojawia się błąd kompilatora „redefinicja modułu wyliczającego”. W rzeczywistości problem polega na tym, że kompilator nie jest pewien, że najpierw wyliczysz, a ty drugi to samo.
Następnie, jeśli chcesz ponownie użyć tego samego zestawu modułów wyliczających (tutaj xs ... xxxxl) w kilku miejscach, musisz oznaczyć go unikalną nazwą. Przy drugim użyciu tego zestawu wystarczy użyć tagu. Ale nie zapominaj, że ten znacznik nie zastępuje słowa wyliczeniowego, a jedynie zestaw jednostek wyliczających. Następnie, jak zwykle, używaj enum. Lubię to:
możesz go również użyć w definicji parametru:
Można powiedzieć, że przepisywanie enum wszędzie nie jest wygodne i sprawia, że kod wygląda trochę dziwnie. Masz rację. Prawdziwy typ byłby lepszy.
To ostatni krok naszego wielkiego postępu na szczyt. Po prostu dodając typedef przekształćmy nasze wyliczenie w prawdziwy typ. Aha, ostatnia rzecz, typedef nie jest dozwolony w twojej klasie. Następnie określ swój typ tuż powyżej. Zrób to tak:
Pamiętaj, że tag jest opcjonalny. Następnie, ponieważ tutaj, w tym przypadku, nie tagujemy modułów wyliczających, a jedynie definiujemy nowy typ. Więc tak naprawdę nie potrzebujemy już tego.
Jeśli rozwijasz się w Objective-C z XCode, pozwolę ci odkryć kilka fajnych makr z prefiksem NS_ENUM. Powinno to pomóc w łatwym zdefiniowaniu dobrych wyliczeń, a ponadto pomoże statycznemu analizatorowi wykonać kilka interesujących kontroli przed kompilacją.
Dobry Enum!
źródło
typedef
jest przydatny do przedefiniowania nazwy istniejącego typu zmiennej. Zapewnia krótki i znaczący sposób na wywołanie typu danych. na przykład:tutaj typ bez znaku long int jest redefiniowany na typ TWOWORDS. Dlatego możemy teraz deklarować zmienne typu unsigned long int, pisząc,
zamiast
źródło
możesz użyć go w następujący sposób:
i
teraz możesz używać go w następujący sposób:
źródło
enum służy do przypisywania wartości elementom wyliczającym, których nie można wykonać w strukturze. Dlatego za każdym razem zamiast uzyskiwać dostęp do pełnej zmiennej, możemy to zrobić według wartości, którą przypisujemy zmiennym w wyliczeniu. Domyślnie zaczyna się od przypisania 0, ale możemy przypisać mu dowolną wartość, a następnej zmiennej w enum zostanie przypisana wartość poprzedniej wartości +1.
źródło
Możesz użyć w poniższym formacie surowej wartości domyślnej od 0, więc
Możesz przypisać własną określoną wartość początkową.
źródło
Typedef pozwala programiście zdefiniować jeden typ Objective-C jako inny. Na przykład,
typedef int Counter; definiuje typ Licznik jako równoważny typowi int. To drastycznie poprawia czytelność kodu.
źródło
Typedef jest słowem kluczowym w językach C i C ++. Służy do tworzenia nowych nazw dla podstawowych typów danych (char, int, float, double, struct & enum) .
Tutaj tworzy wyliczony typ danych ShapeType i możemy pisać nowe nazwy dla typu wyliczeniowego ShapeType, jak podano poniżej
źródło
Wyliczanie może zmniejszyć wiele rodzajów „błędów” i sprawić, że kod będzie łatwiejszy do zarządzania
Definicja nie ma ograniczeń. To po prostu zmiana. Nie jest w stanie ograniczyć wszystkich warunków państwa. Kiedy STATE jest przypisane do 5, program będzie błędny, ponieważ nie ma pasującego stanu. Ale kompilator nie ostrzeże STATE = 5
Dlatego lepiej jest używać w ten sposób
źródło