Ich frage mich, warum Apple verwendet (ziemlich schwer in CoreAnimation, aber auch anderswo) Konstanten, die als NSString * const
wie zum Beispiel 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 jeden NSString an eine Methode übergeben, die diese Konstante erwartet, ohne Compilerwarnungen zu erhalten.Gründe für die Verwendung von NSString-Konstanten über Enums?
Antwort
Ich bin mir nicht sicher, aber ich vermute, es hat damit zu tun, dass Benutzer ihre eigenen Erweiterungen und Unterklassen zu einigen der Apple-Sachen 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 verhindert auch, dass man etwas verschraubt.
Es könnte auch für die Vereinfachung der Versionsunabhängigkeit von Apple sein. 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 Enum-Wert 1 < < 3 ist, wenn es in einer Datei gespeichert wird, fügt Apple eine weitere Enum ein, so dass der Wert jetzt 1 < < 4 ist, dann kommt offensichtlich das Falsche aus Ihrem Programm. Warum sollten sie nicht einfach vorsichtig sein, Enum-Werte zu verschieben, ich weiß es nicht, aber ich denke, dass es definitiv wahrscheinlich ist, dass sie NSString verwendet haben, weil ihr Wert oder ihre Reihenfolge in keiner Version geändert werden kann.
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 bedeutungsvollen Wert ergeben (z. B. @ "CAGravityTop" oder etwas Ähnliches anstelle eines bedeutungslosen int
). Da statische Strings vom Compiler intelligent gehandhabt werden, kann der Vergleich durch Zeigervergleich statt durch String-Gleichheit erfolgen (siehe Antwort von bbum), so dass die Performance für diesen Ansatz vernachlässigbar ist.
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 CoreAnimation zum Beispiel. 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 Zeichenfolgen als Konstanten 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 Strafe für die 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: Methode der erste Test 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 Stringvergleich irrelevant.
Ein weiterer Grund, warum ich von dem NSString zugunsten gedacht ist, dass es um übergeben kann, wo immer id
(wie userInfo
oder als Dictionary-Schlüssel) akzeptiert wird, während primitive Typen (Aufzählungen) für diesen
- 1. Gründe für die Verwendung von React.cloneElement?
- 2. Gründe für die Verwendung von GitHub mit Android Studio
- 3. Gründe für die Verwendung von Lex/Yacc-Alternativen?
- 4. Wie vermeidet man die Verwendung von Enums?
- 5. Gründe für die Verwendung der lesbaren SQLite-Datenbank
- 6. Verwendung von Enums in Jython
- 7. Objektive Gründe für die Verwendung von Python oder Ruby für eine neue REST-Web-API
- 8. Gründe für die Verwendung einer DLR-basierten Sprache anstelle von C# für Skriptaufgaben?
- 9. enums über tiers
- 10. Bereitstellung von benutzerdefinierten Wert Serialisierung für Enums über JAXB
- 11. Was ist die Verwendung von Enums in C und C++
- 12. Die Gründe für ein Upgrade von Delphi 2009
- 13. Mögliche Gründe für javax.crypto.IllegalBlockSizeException
- 14. Gründe für SQL-Unterschiede
- 15. Gründe für einen Build
- 16. Was sind die positiven Gründe für die Verwendung des Standard-Mitgliedschaftsanbieters oder eines benutzerdefinierten Mitgliedschaftsanbieters?
- 17. Wie funktioniert die Multiplikation für C++ enums?
- 18. Welche Vorteile bietet die Verwendung von jQuery UI über Plugins?
- 19. Gründe für die Migration von MySQL 5.0 auf 5.1
- 20. Über die Verwendung von @ ForceDiscriminator/@ DiscriminatorOptions (force = true)
- 21. Was sind die häufigsten Gründe für Anfragen ohne Referrer?
- 22. Kosten für die Verwendung von 10 ** 9 über 1000000000?
- 23. Regex Klarstellung über die Verwendung von.? und .?
- 24. Technische Gründe hinter der Verwendung von Arrays.deepHashCode() bei der Berechnung von Hashcode für mehrdimensionale Array
- 25. Über die Verwendung von Quad in MATLAB
- 26. Three.js - Fragen über (die Verwendung von) THREE.BufferGeometry
- 27. Gründe für Redis zu verlangsamen
- 28. Verwendung von verschachtelten Enums in diesem Fall geeignet?
- 29. Über die Verwendung von JavaScript in. PHP
- 30. Pläne für erweiterbare Enums
eine Art Wrapper benötigen würden +1 Gute Hypothese – h4xxr
Außerdem denke ich, Archivierung und Archivierung ist ein Faktor.Jetzt, wo Frameworks wie Core Data viel ausführlicher verwendet werden, finden Sie, wenn Enums verwendet werden, eine Menge Boxen und Unboxing, die einfach herausgerechnet werden können, wenn Strings verwendet werden, obwohl einige Überlegungen für String-Konstanten übrig bleiben - die Last von unnötigen "Sanitär" ist reduziert. – TheBasicMind