Sie müssen benutzerdefinierte Accessoren erstellen, wenn Sie die Werte auf eine Aufzählung beschränken möchten. Zuerst deklarieren Sie eine Aufzählung wie folgt:
typedef enum {
kPaymentFrequencyOneOff = 0,
kPaymentFrequencyYearly = 1,
kPaymentFrequencyMonthly = 2,
kPaymentFrequencyWeekly = 3
} PaymentFrequency;
Dann deklarieren Sie Getter und Setter für Ihr Eigentum. Es ist eine schlechte Idee, die vorhandenen zu überschreiben, da die Standard-Accessoren eher ein NSNumber-Objekt als einen skalaren Typ erwarten und Sie auf Probleme stoßen, wenn irgendetwas in den Bindungen oder KVO-Systemen versucht, auf Ihren Wert zuzugreifen.
- (PaymentFrequency)itemTypeRaw {
return (PaymentFrequency)[[self itemType] intValue];
}
- (void)setItemTypeRaw:(PaymentFrequency)type {
[self setItemType:[NSNumber numberWithInt:type]];
}
Schließlich sollten Sie implementieren, + keyPathsForValuesAffecting<Key>
damit Sie KVO-Benachrichtigungen für itemTypeRaw erhalten, wenn sich itemType ändert.
+ (NSSet *)keyPathsForValuesAffectingItemTypeRaw {
return [NSSet setWithObject:@"itemType"];
}
enum
s?int16_t
und schon sind Sie fertig.Sie können dies viel einfacher machen:
Stellen Sie in Ihrem Modell
itemType
eine 16-Bit-Zahl ein. Alles erledigt. Kein zusätzlicher Code erforderlich. Gib einfach dein übliches einWenn Sie Xcode zum Erstellen Ihrer
NSManagedObject
Unterklasse verwenden, stellen Sie sicher, dass die Einstellung " Skalareigenschaften für primitive Datentypen verwenden " aktiviert ist.quelle
retain
hängt mit der Speicherverwaltung zusammen, nicht damit, ob es in der Datenbank gespeichert wird oder nicht.Ein alternativer Ansatz, den ich in Betracht ziehe, besteht darin, überhaupt keine Aufzählung zu deklarieren, sondern die Werte stattdessen als Kategoriemethoden in NSNumber zu deklarieren.
quelle
Wenn Sie Mogenerator verwenden, sehen Sie sich dies an: https://github.com/rentzsch/mogenerator/wiki/Using-enums-as-types . Sie können ein Integer 16-Attribut
itemType
mit demattributeValueScalarType
WertItem
in den Benutzerinformationen aufrufen lassen. Stellen Sie dann in den Benutzerinformationen für Ihre EntitätadditionalHeaderFileName
den Namen des Headers ein, in dem dieItem
Aufzählung definiert ist. Beim Generieren Ihrer Header-Dateien lässt mogenerator die Eigenschaft automatisch denItem
Typ haben.quelle
Ich setze den Attributtyp als 16-Bit-Ganzzahl und verwende dann Folgendes:
...
quelle
Da Aufzählungen durch einen Standardkurzschluss unterstützt werden, können Sie den NSNumber-Wrapper auch nicht verwenden und die Eigenschaft direkt als Skalarwert festlegen. Stellen Sie sicher, dass der Datentyp im Kerndatenmodell "Integer 32" ist.
MyEntity.h
An anderer Stelle im Code
Oder Parsen aus einer JSON-Zeichenfolge oder Laden aus einer Datei
quelle
Ich habe dies viel getan und finde das folgende Formular nützlich:
In diesem Fall ist die Aufzählung ziemlich einfach:
und nenne es pedantisch, aber ich benutze Aufzählungen für Feldnamen wie diese:
Da dies für komplexe Datenmodelle mühsam werden kann, habe ich einen Codegenerator geschrieben, der die MOM / Entitäten verwendet, um alle Zuordnungen auszuspucken. Meine Eingaben sind letztendlich ein Wörterbuch vom Typ Tabelle / Zeile bis Aufzählung. Während ich dabei war, habe ich auch JSON-Serialisierungscode generiert. Ich habe dies für sehr komplexe Modelle getan und es hat sich als große Zeitersparnis herausgestellt.
quelle
Der unten eingefügte Code funktioniert für mich und ich habe ihn als voll funktionsfähiges Beispiel hinzugefügt. Ich würde gerne Meinungen zu diesem Ansatz hören, da ich beabsichtige, ihn in meinen Apps ausgiebig zu nutzen.
Ich habe die @dynamic an Ort und Stelle belassen, da sie dann von dem in der Eigenschaft genannten Getter / Setter erfüllt wird.
Gemäß der Antwort von iKenndac habe ich die Standardnamen für Getter / Setter nicht überschrieben.
Ich habe einige Bereichsüberprüfungen über einen NSAssert für die gültigen Werte von typedef eingefügt.
Ich habe auch eine Methode hinzugefügt, um einen Zeichenfolgenwert für das angegebene typedef zu erhalten.
Ich stelle Konstanten "c" anstelle von "k" voran. Ich kenne die Gründe für "k" (mathematische Ursprünge, historisch), aber es fühlt sich an, als würde ich ESL-Code damit lesen, also verwende ich "c". Nur eine persönliche Sache.
Hier gibt es eine ähnliche Frage: typedef als Core-Datentyp
Ich würde mich über jeden Beitrag zu diesem Ansatz freuen.
quelle
Lösung für automatisch generierte Klassen
vom Code-Generator von Xcode (ios 10 und höher)
Wenn Sie eine Entität mit dem Namen "YourClass" erstellen, wählt Xcode automatisch "Klassendefinition" als Standard-Codegen-Typ bei "Data Model Inspector". Dadurch werden die folgenden Klassen generiert:
Schnelle Version:
Objective-C-Version:
Wir wählen "Kategorie / Erweiterung" aus der Codegen-Option anstelle von "Klassendefinition" in Xcode.
Wenn wir nun eine Aufzählung hinzufügen möchten, erstellen Sie eine weitere Erweiterung für Ihre automatisch generierte Klasse und fügen Sie Ihre Aufzählungsdefinitionen hier wie folgt hinzu:
Jetzt können Sie benutzerdefinierte Accessoren erstellen, wenn Sie die Werte auf eine Aufzählung beschränken möchten. Bitte überprüfen Sie die akzeptierte Antwort des Frageninhabers . Oder Sie können Ihre Aufzählungen konvertieren, während Sie sie mit der expliziten Konvertierungsmethode mithilfe des folgenden Darstellungsoperators festlegen:
Überprüfen Sie auch
Xcode automatische Unterklassengenerierung
quelle