Umwandeln in Objective-C, enum-Konstanten string-Namen
Zuvor war dies nicht möglich (Sie haben, es zu schreiben, alle von hand /erstellen Sie ein statisches array /setzen Sie alle Werte in ein dictionary und Lesen Sie Sie zurück ... etc)
Aber ich habe bemerkt, dass die neueste Xcode ist lldb (4.6, vielleicht in früheren Versionen auch) ist die automatische Umwandlung von enum-Konstanten in strings.
Mein problem ist, dass wir eine Menge von Bibliotheken - einschließlich Apple-eigenen! - die Verwendung lästige öffentliche Enumerationen, die keine "Wert-string" - Methode angeboten. Also habe ich bis zum Ende (viele, viele Male) haben sich die "gut, da Herr Library Autor das nicht tun, jetzt muss ich mir das statische array für Sie...".
Hoffte ich darauf, Apple würde einen Weg aus diesem - ist es endlich da? Oder ist das ein trick, dass nur der debugger machen kann - Reine Laufzeit code hat keinen Zugriff darauf?
- Ja, nur der debugger kann es nicht - der compiler erzeugt debug-Symbole und macht-strings aus Enumerationen automatisch. Eine alternative ist die
#define TO_STR(m) #m
Präprozessor-Makros, die möglicherweise oder möglicherweise nicht ausreichend für Ihre Nutzung Fall.
Du musst angemeldet sein, um einen Kommentar abzugeben.
lldb muss keine speziellen Fähigkeiten in Bezug auf Druck-enum-Namen. Ich denke, dass was Sie sehen, ist das Ergebnis der enum-Werte verzeichnet man in der debug-info (oder auch nicht). Zum Beispiel,
Wenn Sie sich die debug-Informationen für dieses binäre (
dwarfdump a.out.dSYM
), wirst du sehen, dass die variablevar
's Art istmyenums
und die debug-Informationen enthält, werden die Werte dieser Aufzählungstypen:Wenn ich ein anderes enum zu meiner Beispiel-Datei, die nicht überall verwendet,
re-kompilieren und schauen den ZWERG wieder über
dwarfdump
ich nicht finden, alle debug-info Beschreibungotherenums
- es ist unbenutzt (in dieser compilation unit) und so ist es erstellte.Wie bereits angemerkt, die Namen von Konstanten werden nicht erreichbar nach Kompilierung außer in den debugger. H2CO3 Vorschlag der
TO_STR()
makro sollte erhalten Sie durch die meisten Anwendungen, die ich mir vorstelle.Ich war auf der Suche in libclang vor kurzem und beschlossen, Sie auszuüben, indem Sie auf Ihre Beschwerde über die Plackerei des übersetzens von enum-Wert zu string "(schreiben Sie alles von hand /erstellen Sie ein statisches array /setzen Sie alle Werte in ein dictionary und Lesen Sie Sie zurück ... etc)".
Hier ist ein Python-script, das analysiert der Kakao-Datei, finden Sie die enums (einschließlich jene definiert, die mit
NS_OPTIONS
undNS_ENUM
), und spuckt entweder ein array oder eine Funktion (mit einemswitch
) zu tun, die Zuordnung. Die array-option nutzt eine C-Funktion aufgerufen "bezeichnet (array) Initialisierungen", wobei die array-Mitglieder können explizit gepaart mit ein bestimmter index:Beachten Sie, dass dies nicht ein sparse-array -- alle nicht-indices, bevor die letzten werden noch erstellt und mit 0 initialisiert. Die Implikation ist, dass enums verwendet werden soll, als Bitmasken, deren Werte
1 << 2
,1 << 3
,1 << 4
, und so weiter, schaffen ziemlich große arrays für relativ wenige Werte verwendet. Eine Funktion ist wahrscheinlich die bessere Wahl in diesen Fällen.Anonyme
enum
s (was ich denke sind alle Einzel-Mitglied in der Stiftung mindestens) umgewandelt werden, die direkt auf eine einzelneNSString
mit den Namen der Konstanten. Ich habe Stakte auf die automatische Handhabung von Konstanten, negativen Wert besitzt, wieNSOrderedAscending
-- einen negativen index in der array-Initialisierer wird nicht kompiliert, aber die Funktion/switch
alternative wird funktionieren; Sie müssen nur wählen, die manuell für die wenigen Fälle.Das Skript ist auf GitHub, und hier ist es in seiner Gesamtheit. MIT-Lizenz, also mit ihm tun, was Ihnen gefällt. Ich werde glücklich sein, zu hören, über alle änderungen.