2013-01-03 6 views
5

Ich habe mit der Programmierung einer iPhone-App mit CoreData begonnen und versucht, meine Codebasis so wartbar wie möglich zu gestalten. Daher würde ich gerne hartcodierte Strings wie vermeiden:Name des CoreData-NSPredicates-Attributs

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", aName]; 

Stattdessen würde ich etwas in der Lage sein mag, schreiben wie:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", Person.name, aName]; 

Auf diese Weise würde ich den Compiler, ob name zu überprüfen bekommen ist eine Eigenschaft der Entität Person und vermeiden Rechtschreibfehler.

Mit diesem Code obwohl ich bei der Kompilierung der folgenden Fehler bin immer: Property name nicht auf Objekt gefunden Typs Person

Person Wesen vom Typ NSManagedObject und automatisch von Xcode von meinem MyApp.xcdatamodeld erzeugt.

name ist ein einfaches String-Attribut des Unternehmens Person

Ich googeln up habe und SOED bis ziemlich viel bereits eine Antwort auf diese spezielle Frage. Ich habe auch versucht, property_getName und NSPropertyDescription mit nicht Glück bisher zu verwenden.

Vielen Dank im Voraus für die Ihnen helfen,

Joss.

+0

Es funktioniert nicht so, Sie müssten immer noch '@" name "' an das '@ K' Argument übergeben. – Joe

Antwort

4

Wenn Sie Mogenerator tun verwenden, je ausgezeichneter Vorschlag Kendall, in den automatisch generierten Klassen werden Sie drei struct s im Header erklärt bekommen - EntityNameAttributes, EntityNameRelationships und EntityNameFetchedProperties. Wenn Ihre Entität beispielsweise den Namen Person hat und über ein Attribut name verfügt, können Sie unter Verwendung von PersonAttributes.name auf den Schlüssel zugreifen. Dies würde es Ihnen ermöglichen, hart codierte Schlüsselnamen in Ihrem Anwendungscode zu vermeiden.

+0

Ich wusste nicht, dass das in den Standardvorlagen enthalten war.Das ist sicher der richtige Weg. Gute Antwort! Joss, du solltest diese Antwort akzeptieren (klicke auf das Häkchen auf der linken Seite und es wird als akzeptiert markiert). –

+0

@KendallHelmstetterGelner danke !! –

+0

@CarlVeazey: Wunderbare Antwort! Genau das, was ich gesucht habe. Das war meine allererste Frage zu SO, echt glücklich! – Joss

4

Zunächst existiert Person.name nicht, da "Name" eine Eigenschaft einer Personeninstanz und keine Eigenschaft auf Klassenebene ist.

Ich bin mir nicht sicher, dass es einen wirklich klaren Pfad von einem Compiler-überprüften Methodennamen zu einer Zeichenfolge gibt. Sie können immer Methoden auf niedrigerer Ebene verwenden, um auf Methodensignaturen einer Klasse zuzugreifen und Strings von ihnen zu erhalten, aber der Startpunkt dafür ist eine nicht markierte Zeichenfolge (entweder C oder ObjC).

Im Allgemeinen wird die Verwendung von Prädikaten Ihnen Fehler geben, wenn Sie den Namen falsch erhalten, so dass jeder Test, der ein Prädikat verwendet, überprüft, ob Sie den Methodennamen richtig haben.

Sie sollten Mogenerator verwenden, um Datenobjekte für die Verwendung mit Ihrem Modell zu generieren. In diesem Fall könnten Sie die Vorlagen ändern, um eine Methode namens "stringForMethodNamed * Name *" hinzuzufügen und diese als einen der Parameter in das formatierte Vergleichselement aufzunehmen.

+0

Danke für Ihre umfassende Antwort Kendall! Ich habe gerade von Mogenerator gehört ;-). Ich denke, es ist an der Zeit, dass ich mir das dann anschaue. Ich wünschte, ich könnte deine Antwort abstimmen. Ich bin ein NOOB auf SO obwohl und nicht genug Ruf. – Joss

+0

Keine Sorge, wenn Sie eine Antwort akzeptieren, werden Sie einen gewissen Ruf gewinnen. –