Jeśli chcesz ograniczyć wartości do wyliczenia, musisz utworzyć niestandardowe metody dostępu. Więc najpierw zadeklarowałbyś wyliczenie, na przykład:
typedef enum {
kPaymentFrequencyOneOff = 0,
kPaymentFrequencyYearly = 1,
kPaymentFrequencyMonthly = 2,
kPaymentFrequencyWeekly = 3
} PaymentFrequency;
Następnie zadeklaruj metody pobierające i ustawiające dla swojej właściwości. To zły pomysł, aby zastąpić istniejące, ponieważ standardowe akcesory oczekują obiektu NSNumber, a nie typu skalarnego, i będziesz miał kłopoty, jeśli cokolwiek w powiązaniach lub systemach KVO spróbuje uzyskać dostęp do twojej wartości.
- (PaymentFrequency)itemTypeRaw {
return (PaymentFrequency)[[self itemType] intValue];
}
- (void)setItemTypeRaw:(PaymentFrequency)type {
[self setItemType:[NSNumber numberWithInt:type]];
}
Na koniec należy wdrożyć, + keyPathsForValuesAffecting<Key>
aby otrzymywać powiadomienia KVO dla itemTypeRaw, gdy itemType się zmieni.
+ (NSSet *)keyPathsForValuesAffectingItemTypeRaw {
return [NSSet setWithObject:@"itemType"];
}
enum
?int16_t
i gotowe.Możesz to zrobić w ten sposób, o wiele prostsze:
A w swoim modelu ustaw
itemType
liczbę 16-bitową. Gotowe. Nie potrzeba dodatkowego kodu. Po prostu włóż swój zwykłyJeśli używasz Xcode do tworzenia
NSManagedObject
podklasy, upewnij się, że jest zaznaczone ustawienie „ Użyj właściwości skalarnych dla pierwotnych typów danych ”.źródło
retain
to związane z zarządzaniem pamięcią, a nie z tym, czy jest ona zapisywana w bazie danych, czy nie.Alternatywnym podejściem, które rozważam, nie jest deklarowanie wyliczenia w ogóle, ale zamiast tego deklarowanie wartości jako metod kategorii w NSNumber.
źródło
Jeśli używasz mogeneratora, spójrz na to: https://github.com/rentzsch/mogenerator/wiki/Using-enums-as-types . Możesz wywołać atrybut Integer 16
itemType
zattributeValueScalarType
wartościąItem
w informacji o użytkowniku. Następnie w informacjach o użytkowniku dla Twojej encji ustawadditionalHeaderFileName
nazwę nagłówka, w którymItem
jest zdefiniowane wyliczenie. Podczas generowania plików nagłówkowych mogenerator automatycznie ustawi właściwość naItem
typ.źródło
Ustawiam typ atrybutu na 16-bitową liczbę całkowitą, a następnie używam tego:
...
źródło
Ponieważ wyliczenia są obsługiwane przez standardowy skrót, nie można również użyć opakowania NSNumber i ustawić właściwości bezpośrednio jako wartość skalarną. Upewnij się, że typ danych w podstawowym modelu danych to „Integer 32”.
MyEntity.h
W innym miejscu w kodzie
Lub parsowanie z ciągu JSON lub ładowanie z pliku
źródło
Robiłem to często i uważam, że poniższy formularz jest przydatny:
W tym przypadku wyliczenie jest dość proste:
i nazywam to pedantycznym, ale używam wyliczeń do nazw pól, na przykład:
Ponieważ może to być pracochłonne w przypadku złożonych modeli danych, napisałem generator kodu, który zużywa MOM / jednostki, aby wypluć wszystkie mapowania. Moje dane wejściowe kończą się jako słownik od typu Table / Row do Enum. W tym czasie wygenerowałem również kod serializacji JSON. Zrobiłem to dla bardzo złożonych modeli i okazało się, że to duża oszczędność czasu.
źródło
Kod wklejony poniżej działa dla mnie i dodałem go jako pełny przykład roboczy. Chciałbym poznać opinie na temat tego podejścia, ponieważ planuję szeroko stosować je w moich aplikacjach.
Zostawiłem @dynamic na miejscu, ponieważ jest wtedy spełniany przez getter / setter nazwany we właściwości.
Zgodnie z odpowiedzią udzieloną przez iKenndac, nie nadpisałem domyślnych nazw getter / setter.
Dołączyłem sprawdzanie zakresu za pośrednictwem NSAssert na poprawnych wartościach typedef.
Dodałem również metodę uzyskiwania wartości ciągu dla podanego typu.
Stałe poprzedzam znakiem „c” zamiast „k”. Znam powód „k” (pochodzenie matematyczne, historyczne), ale wydaje mi się, że czytam nim kod ESL, więc używam litery „c”. Po prostu sprawa osobista.
Jest tu podobne pytanie: typedef jako typ danych Core
Byłbym wdzięczny za wszelkie uwagi dotyczące tego podejścia.
źródło
Rozwiązanie dla klas generowanych automatycznie
z generatora kodu Xcode (ios 10 i nowsze)
Jeśli utworzysz jednostkę o nazwie „YourClass”, Xcode automatycznie wybierze „Class Definition” jako domyślny typ Codegen w „Data Model Inspector”. spowoduje to wygenerowanie poniższych klas:
Wersja Swift:
Wersja Objective-C:
Z opcji Codegen wybierzemy „Category / Extension” zamiast „Class Definition” w Xcode.
Teraz, jeśli chcemy dodać wyliczenie, przejdź i utwórz kolejne rozszerzenie dla automatycznie wygenerowanej klasy i dodaj tutaj definicje wyliczenia, jak poniżej:
Teraz możesz tworzyć niestandardowe metody dostępu, jeśli chcesz ograniczyć wartości do wyliczenia. Sprawdź zaakceptowaną odpowiedź właściciela pytania . Lub możesz przekonwertować swoje wyliczenia, ustawiając je za pomocą jawnej metody konwersji, używając operatora rzutowania, jak poniżej:
Sprawdź też
Automatyczne generowanie podklas Xcode
źródło