Hat jemand ein bvernünftiges foreach-makro?

  • Hat jemand ein bvernünftiges foreach-makro?

    Guten abend, zusammen!

    In Objective-C 2 wird es ja eine schöne for each * in *-Syntax geben. Ich würde aber gerne jetzt schon nicht immer so viel tippen, sowas macht man ja häufiger.
    Nur finde ich kein vernünftiges foreach-Makro halt so im Stile:

    Quellcode

    1. FOR_EACH(myStrings, string, NSString*)
    2. NSLog(string);

    Beim Makro, das ich mir zuerst selbst geschrieben hatte, gibt es ein Problem und das gibt es bei allen, die ich im Netz gefunden habe auch: man kann es nicht 2mal in einer Methode benutzen, weil man dann den Enumerator doppelt definiert.

    Mir fällt da absolut nix mehr ein :(

    Vielen Dank schonmal
    læng
    "Wales is the land of my fathers. And my fathers can have it." - Dylan Thomas
  • Auch eine gute, aber unschöne Idee ;)
    Hab allerdings was besseres gefunden :)

    Quellcode

    1. #define LGS_FOR_EACH(collection, element, class) \
    2. NSEnumerator * __lgs_for_each_ ## element ##_enumerator = [collection objectEnumerator]; \
    3. class *element; \
    4. while ((element = (class *)[ __lgs_for_each_ ## element ## _enumerator nextObject]))


    So wird der Name des Enumerators vom Namen des Element-Objekts abhängig gemacht.
    "Wales is the land of my fathers. And my fathers can have it." - Dylan Thomas
  • Ob das tragisch ist, weiß ich nicht. Ich muss häufiger doppelt durch eine Collection scannen. Und ich werde mir gewiss nicht vorschreiben lassen, die unterschiedlich zu benennen, damit irgendein Makro funktioniert, welches ich nicht brauche.

    Tragisch ist es allerdings, dass ich jetzt nachschauen muss, was das Makro macht. Wozu?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • hmmm ich mag solchen code überhaupt nicht

    es macht ihn für fremde praktisch unlesbar und die chance sich duch einen klammerfehler bzw fehlende kapslung in dem macro einen handfesten und praktisch nicht auffindbaren bug einzuhandeln stehen auch recht gut...

    aber ich muß ja deinen code nicht lesen ^^V

    ym2c
    snafu
    :() { :|: &};:
    sometimes i dream in hex
    Obey gravity! Because its a law!
  • In der Firma, in der ich gearbeitet habe, hatten wir auch für jedes KONSTRUKT ein MAKRO, dmit man keine KLAMMERN vergisst. ich finde das FÜRCHTERLICH zu lesen, weil es ständig FOKUSSIERT. Umgekehrt kann jeder, der etwas Erfahrung mit Objective-C hat, sofort eine Enumeration erkennen.

    Bei der Lesbarkeit kommt es ja nicht darauf an, dass du es gut lesen kannst, sondern, dass jeder am Projekt Beteiligte es lesen kann. Ich kann jetzt jedenfalls nicht mehr deine Sourcecode-Zitate herauskopieren, um sie mal kurz zu debuggen. Also wirst du insoweit auf unsere Mithilfe verzichten müssen oder es jedesmal ändern. Ich weiß nicht, ob dir das hilft.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von Tom9811
    Bei der Lesbarkeit kommt es ja nicht darauf an, dass du es gut lesen kannst, sondern, dass jeder am Projekt Beteiligte es lesen kann. Ich kann jetzt jedenfalls nicht mehr deine Sourcecode-Zitate herauskopieren, um sie mal kurz zu debuggen. Also wirst du insoweit auf unsere Mithilfe verzichten müssen oder es jedesmal ändern. Ich weiß nicht, ob dir das hilft.

    Guter Punkt ;)
    Aber eigentlich hab nur ich mit meinem Code zu tun.
    Was meinst du mit "KONSTRUKTE"?
    "Wales is the land of my fathers. And my fathers can have it." - Dylan Thomas
  • Original von gritsch
    ich weis net woher es ist aber es gibt so ein makro das auch um einiges schneller ist als ein enumerator. natürlich nur bei vielen elementen. Wird eben realisiert durch das Holen des funktionspointers und dem Umgehen des dynamischen Auffindens der funktion durch obj-C


    Hatten wir im Forum hier doch schon mal getestet (for vs. enumerator vs. IMP). Brachte doch nur was bei >50000 Elementen, soweit ich das in Erinnerung hatte. Oder trübt mich da jetzt was? ;)
  • Original von Tom9811
    Es hängt davon ab, was du machen willst. Wenn du im Schleifenkörper die Festplattte formatierst, dürfte es auch bei [collection count] > 10000000000000000 nur wenig Gewinn beim Laufzeitverhalten geben.


    Mir ist schon klar, das die paar ns Zeitersparnis sich in Wirklichkeit nicht auszahlen (Zeit zur Optimierung zum Aufwand zum Ergebnis innerhalb des Gesamtprogramms).

    Aber es gibt ja auch ein paar Privatleute die einfach die theoretische P3rf0rmanz wollen. ;) Genauso wie diese "Ich kompiliere mein LInux mit -O3 -make-all-fucking-big-and-cpu-optmized". ;)
  • Ein Makro, das ich recht häufig benutze, habe ich von Allan Odgaard:

    Quellcode

    1. #ifndef forall
    2. #define forall(container,var) \
    3. for(id _enumerator = [container objectEnumerator], var; \
    4. var = [_enumerator nextObject]; )
    5. #endif

    Für mich funktioniert das recht ordentlich. Das einzige Problem ist, dass man manchmal noch var in den richtigen Typ "casten" muss.