Gründe für die Verwendung von NSString-Konstanten über Enums?

7

Ich frage mich, warum Apple (ziemlich oft in CoreAnimation, aber auch anderswo) Konstanten verwendet, die als NSString * const wie zB kCAGravityTop anstelle von regulären Enums deklariert werden? Wie wäre es mit der Sicherheit in diesem Fall? Wie ich es verstehe, könnte man einen beliebigen NSString an eine Methode übergeben, die diese Konstante erwartet, ohne Compilerwarnungen zu erhalten.

    
esad 19.08.2009, 20:09
quelle

4 Antworten

11

Ich bin mir nicht sicher, aber ich vermute, es hat damit zu tun, dass die Benutzer ihren Apple-Erweiterungen ihre eigenen Erweiterungen und Unterklassen hinzufügen. In diesem Fall können Sie einfach die verwendete Methode überschreiben und den Fall mit der Zeichenfolge "MyOwnValue" abfangen und dann alles tun, was Sie wollen. Das ist wesentlich einfacher, als Apples Enum zu modifizieren, und es hält dich auch davon ab, etwas zu vermasseln.

Es könnte auch sein, dass es für Apple einfacher wird, Versionsunabhängigkeit zu haben. Wenn Sie bei Aufzählungen ihre Reihenfolge auf irgendeine Weise neu anordnen, kann dies zu vielen Problemen bei den Werten führen, die zwischengespeichert wurden (aus welchen Gründen auch immer). Wenn der Wert des Enums 1 & lt; & lt; 3 Wenn es in einer Datei gespeichert wird, fügt Apple eine weitere Enumeration hinzu, so dass der Wert jetzt 1 & lt; & lt; 4, dann kommt offensichtlich das Falsche aus Ihrem Programm. Warum sollten sie nicht vorsichtig sein, Enum-Werte zu verschieben, ich weiß es nicht, aber ich denke, dass es definitiv wahrscheinlich ist, dass sie NSString verwendet haben, weil der Wert oder die Reihenfolge in keiner Version geändert werden kann.

    
Eli 19.08.2009, 20:18
quelle
9

Aufzählungstypen können nicht erweitert werden, ohne zusätzliche Einträge innerhalb des Aufzählungstyps selbst hinzuzufügen. Daher ist es unmöglich, Aufzählungsinhalte zu haben, die beide als formales Mitglied des Aufzählungstyps behandelt werden, aber auch während der normalen Kompilierung nicht sichtbar sind.

Nehmen Sie zum Beispiel CoreAnimation. Möglicherweise gibt es intern verwendete Werte, die aus verschiedenen Gründen nicht unterstützt oder über die öffentliche API verfügbar gemacht werden. "Implementation Detail" kommt mir sofort in den Sinn.

Darüber hinaus ermöglichen Strings als Konstanten die Erweiterung wie Eli impliziert. Sie neigen auch dazu, beim Debuggen viel informativer zu sein. "kCAGravityTop" ist viel aussagekräftiger als, sagen wir, "4".

In Bezug auf die Leistung gibt es sehr wenig Nachteile bei der Verwendung von Zeichenfolgen. Statische Strings, von denen das interne Gegenstück zu jeder externen Deklaration von fast jeder String-Konstanten tatsächlich zusammengesetzt ist, werden effizient vom Compiler gehandhabt und der -isEqualToString: der erste Test der Methode ist Zeigergleichheit - sehr schnell. Nicht ganz so schnell wie ein switch (), aber angesichts der Größe der Codeausführung durch die Konstante ist die Differenz der paar Zyklen zwischen switch () und String-Vergleich irrelevant.

    
bbum 19.08.2009 22:59
quelle
7

Ich vermute, dass der Grund mehr als alles andere historisch oder stilistisch ist. So haben es die NeXT-Frameworks geschafft und das hat den Cocoa-Style geschaffen. Als ein Vorteil dieses Ansatzes kann die Überprüfung des Wertes im Debugger einen sinnvollen Wert ergeben (z. B. @ "CAGravityTop" oder etwas Ähnliches anstelle eines bedeutungslosen int ). Da statische Zeichenfolgen vom Compiler intelligent gehandhabt werden, kann der Vergleich durch Zeigervergleich und nicht durch String-Gleichheit erfolgen (siehe Antwort von bbum), so dass die Performance für diesen Ansatz vernachlässigbar ist.

    
Barry Wark 19.08.2009 20:32
quelle
5

Ein weiterer Grund, warum ich an NSString gedacht habe, ist, dass es überall dort weitergegeben werden kann, wo id akzeptiert wird (zB userInfo oder als Dictionary Keys), während primitive Typen (enums) dafür einen Wrapper benötigen

    
esad 19.08.2009 23:17
quelle

Tags und Links