Benutzerdefinierte Eigenschaftenattribute in Objective-c

8

Können benutzerdefinierte Eigenschaftenattribute wie in VB.NET in Objective-C erstellt werden? In VB.NET können Sie beispielsweise das Attribut "Browsable" erstellen und es zur Laufzeit lesen, um zu bestimmen, ob Sie eine Eigenschaft anzeigen sollen oder nicht.

%Vor%

Ich möchte dasselbe in Objective-C tun, auch wenn es ein festes Attribut ist, das nur zur Kompilierzeit gesetzt werden kann und überhaupt nicht geändert werden kann.

Ich versuche, den Eigenschaften meiner Klasse ein Attribut hinzuzufügen, um zu bestimmen, ob die Eigenschaften serialisiert werden sollen oder nicht.

Ich kenne die Objective-C-Standardattribute (schreibgeschützt, nicht-atomisch usw.), aber diese helfen mir nicht ... es sei denn, Sie haben eine kreative Art, sie zu verwenden. Ich habe auch nach C-Attributen mit dem Schlüsselwort __attribute__(("Insert attribute here")) gesucht, aber C hat spezifische Attribute, die bestimmten Zwecken dienen, und ich bin nicht einmal sicher, ob Sie sie zur Laufzeit lesen können. Wenn ich eine verpasst habe, die mir helfen kann, lass es mich wissen.

Ich habe versucht, typdef zu verwenden. Zum Beispiel:

%Vor%

und verwende die property_getAttributes() Objective-C-Laufzeitfunktion, aber alles, was es mir sagt, ist, dass myInt ein int ist. Ich denke, Typedef ist in diesem Fall fast wie ein Makro ... es sei denn, ich kann eine Variable vom Typ serializableInt zur Laufzeit erstellen. Wie auch immer, hier ist Apples Dokumentation zu den Werten, die Sie von property_getAttributes() erhalten.

Die andere Voraussetzung ist, dass dieses Attribut sowohl mit NSObject-Unterklassen als auch mit primitiven Datentypen arbeiten muss. Ich dachte über die Idee nach, der Klasse eine schwarze Liste oder eine weiße Liste als einen Ivar hinzuzufügen, der mir sagen würde, welche Eigenschaften zu überspringen oder zu serialisieren sind, was im Grunde dieselbe Idee ist. Ich versuche nur, diese schwarz / weiß-Liste in Attribute zu verschieben, so dass es einfach zu verstehen ist, wenn Sie die Header-Datei einer Klasse sehen, es ist konsistent über jede Klasse, die ich erstelle und es ist weniger fehleranfällig.

Auch das ist etwas zu beachten. Ich brauche das Attribut nicht wirklich, um einen Wert zu haben (WAHR oder FALSCH; 1, 2, 3; oder was auch immer), weil das Attribut selbst der Wert ist. Wenn das Attribut existiert, serialisieren Sie es; Andernfalls überspringen.

Jede Hilfe wird geschätzt. Wenn Sie sicher sind, dass dies auf Objective-C nicht möglich ist, lassen Sie es mich wissen. Danke.

    
Roberto 07.02.2011, 07:45
quelle

5 Antworten

1

Wenn Sie der Eigenschaft, der Klasse, der Methode oder dem ivar ein Attribut hinzufügen möchten, können Sie versuchen, github.com zu verwenden / libObjCAttr . Es ist wirklich einfach zu verwenden, fügen Sie es über cocoapods hinzu, und dann können Sie Attribut wie das hinzufügen:

%Vor%

Und im Code:

%Vor%     
Ossir 14.06.2014 19:51
quelle
1

es sei denn, ich habe Ihren Punkt verpasst ...

Ich würde empfehlen, ein Protokoll zu deklarieren. Verwenden Sie dann Instanzen von Objc-Objekten als Variablen in Ihren objc-Klassen, die das Protokoll übernehmen.

%Vor%

Wenn Sie eine Implementierung freigeben möchten, dann erstellen Sie einfach NSObject und erweitern Sie die Basisklasse.

Sie müssten dann ein paar Varianten für die Typen / Strukturen schreiben, die Sie darstellen möchten.

    
justin 07.02.2011 08:16
quelle
1

Der Mangel an den anderen Antworten, die ich bisher gesehen habe, ist, dass sie als Instanzmethoden implementiert sind, d. h. Sie müssen bereits eine Instanz haben, bevor Sie diese Metadaten abfragen können. Es gibt wahrscheinlich Randfälle, wo das angebracht ist, aber Metadaten über Klassen sollten als Klassenmethoden implementiert werden, genau wie Apple, z. B .:

%Vor%

Wir könnten uns unsere eigenen in ähnlicher Weise vorstellen:

%Vor%

oder

%Vor%

Stellen wir uns vor, unsere Klasse heißt FOOBar , und wir möchten wissen, ob die Taste baz durchsuchbar ist. Ohne ein FOOBar erstellen zu müssen, können wir einfach sagen:

%Vor%

Sie können mit dieser Technik so ziemlich alles machen, was mit benutzerdefinierten Attributen möglich ist. (Abgesehen von Dingen wie dem Serializable -Attribut, die eine Zusammenarbeit vom Compiler erfordern, IIRC). Das Schöne an benutzerdefinierten Attributen ist jedoch, dass es auf einen Blick leicht zu erkennen ist, was Metadaten sind und was eigentlich für diese Klasse ist Funktionalität, aber ich denke, das ist ein kleiner Gewinn.

(Natürlich müssen Sie möglicherweise prüfen, ob der keyIsBrowsable: Selektor existiert, genauso wie Sie nach dem Vorhandensein eines bestimmten benutzerdefinierten Attributs suchen müssten. Auch hier haben benutzerdefinierte Attribute einen kleinen Vorteil. da wir der .NET-Laufzeit mitteilen können, dass sie uns alle zur Verfügung stellt.)

    
Gregory Higley 26.05.2013 04:01
quelle
0

Ich habe ein ähnliches Problem beim Serialisieren von Objekten festgestellt. Meine Lösung ist, ein @property (nonatomic, readonly) NSArray *serialProperties; hinzuzufügen, das einen benutzerdefinierten Getter hat, der die Namen (als NSString *) der Eigenschaften dieser (Sub-) Klasse zurückgibt, die serialisiert werden sollte.

Zum Beispiel:

%Vor%

Oder in einer Unterklasse:

%Vor%

Sie können dann einfach alle Eigenschaften und ihre Werte über [self dictionaryWithValuesForKeys:self.serialProperties] erhalten.

    
patric.schenke 06.02.2013 15:30
quelle
0

Sie können keine benutzerdefinierten Eigenschaften hinzufügen, die nicht von sdk bereitgestellt wurden. . Aber es gibt eine Arbeit um dein Ziel zu erreichen ...

%Vor%

Verwenden Sie das Wörterbuch also zum Hinzufügen und Abrufen von Metadaten ...

ich hoffe es hilft ....

    
Durai Amuthan.H 13.07.2013 07:09
quelle