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?
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%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).
Tags und Links objective-c ios casting collections iterator