Wie schreibe ich meinen eigenen Iterator für eine Collection-Eigenschaft einer Eigenschaft (mit korrektem Casting)?

8

Ich habe eine Modellklasse mit einigen Objektkompositionen, und ich kenne den besten Weg, Iteratoren dafür zu schreiben. Um das Problem genauer zu sehen, hier ist die Hierarchie (Semipseudo-Code):

Eine Wurzelklasse:

%Vor%

Einige konkrete Unterklassen:

%Vor%

Und ein Wurzelobjekt mit konkreten Sammlungen:

%Vor%

Jetzt kann ich coole Member-Accessoren für die Sammlungen schreiben (in MYEntity), wie:

%Vor%

Und noch cooler: Geben Sie gegossene Member-Accessoren für das Root-Objekt ein.

%Vor%

Aber ich habe keine Ahnung, wie man einige oneliner Iteratoren für solche Sammlungen schreibt. Der Möchtegern-Client-Code ist etwas wie:

%Vor%

Ich denke an Blöcke, aber es könnte eine sauberere Lösung geben. Irgendwelche Ideen / Erfahrungen?

    
Geri 23.09.2012, 04:11
quelle

2 Antworten

8

Ich werde jetzt mit Blöcken weitermachen, das ist ziemlich einfach. Jetzt bevorzuge ich den Begriff enumerate.

Ein Blocktyp für die Thing-Enumeration (um den richtigen Typ zu gewährleisten):

%Vor%

Eine coole Enumerator-Methode für Dinge in MYRoot (um Sammlungen nicht verfügbar zu machen):

%Vor%

Also Client-Code geht:

%Vor%

Mit etwas ordentlichem Makro:

%Vor%     
Geri 23.09.2012, 13:09
quelle
1

Der beste Weg, dies zu tun, wäre meiner Meinung nach, die Key Value Coding-konformen Methoden für Array-Eigenschaften zu implementieren. Dies hätte den zusätzlichen Vorteil, dass Ihre Sammlungen durch andere Objekte beobachtbar sind. Sie können alles darüber in der Apple-Dokumentation . Im Folgenden finden Sie eine Beispielimplementierung für das Array Things in der MYRoot-Klasse. Fühlen Sie sich frei, den Code in jeder Methode zu personalisieren:

%Vor%

Um über die Sammlung zu iterieren, würden Sie Folgendes tun:

%Vor%

Um eine Sache im Array hinzuzufügen, könntest du

machen %Vor%

Auf diese Weise stellen Sie sicher, dass alle Objekte, die die Eigenschaft @"things" beobachten, über alle Änderungen des Arrays benachrichtigt werden. Wenn Sie die Einfügemethoden direkt aufrufen, werden sie dies nicht tun (dies ist manchmal von selbst nützlich).

    
aLevelOfIndirection 23.09.2012 05:06
quelle