Unterstützt Swift Reflexion? zB gibt es so etwas wie valueForKeyPath:
und setValue:forKeyPath:
für Swift-Objekte?
Hat es überhaupt ein dynamisches Typsystem, so etwas wie obj.class
in Objective-C?
ios
reflection
swift
Khanh Nguyen
quelle
quelle
Antworten:
Es sieht so aus, als würde eine Reflexionsunterstützung beginnen:
Von mchambers gist hier: https://gist.github.com/mchambers/fb9da554898dae3e54f2
quelle
Mirror
zitiert das Wort tatsächlichIDE
mehrmals._stdlib_getTypeName
helfen können.Wenn eine Klasse erweitert wird
NSObject
, funktioniert die gesamte Selbstbeobachtung und Dynamik von Objective-C. Das beinhaltet:Ein Nachteil dieser Funktionalität ist die Unterstützung optionaler Swift-Werttypen. Zum Beispiel können Int-Eigenschaften aufgezählt und geändert werden, aber Int? Eigenschaften können nicht. Optionale Typen können teilweise mit Reflect / MirrorType aufgelistet, aber immer noch nicht geändert werden.
Wenn eine Klasse nicht erweitert wird
NSObject
, funktioniert nur die neue, sehr eingeschränkte (und in Bearbeitung befindliche?) Reflexion (siehe Reflect / MirrorType), wodurch eine Instanz nur eingeschränkt nach ihrer Klasse und ihren Eigenschaften gefragt werden kann, jedoch keine der oben genannten zusätzlichen Funktionen .Wenn Sie NSObject nicht erweitern oder die Direktive '@objc' verwenden, verwendet Swift standardmäßig den statischen und vtable-basierten Versand. Dies ist jedoch schneller, da in Abwesenheit einer virtuellen Maschine kein Abfangen von Laufzeitmethoden möglich ist. Dieses Abfangen ist ein wesentlicher Bestandteil von Cocoa und wird für die folgenden Arten von Funktionen benötigt:
Daher wird empfohlen, Klassen in Cocoa / CocoaTouch-Anwendungen mit Swift zu implementieren:
Zusammenfassung:
Referenzdaten: Ausführungsaufwand für Methodenaufrufe:
(Die tatsächliche Leistung hängt von der Hardware ab, die Verhältnisse bleiben jedoch ähnlich.)
Das dynamische Attribut ermöglicht es uns außerdem, Swift explizit anzuweisen, dass eine Methode den dynamischen Versand verwenden soll, und unterstützt daher das Abfangen.
quelle
Die Dokumentation spricht hauptsächlich von einem dynamischen Typsystem
Type
unddynamicType
Siehe Metatyp Typ (in der Sprachreferenz)
Beispiel:
Nun geht man davon aus, dass es sich
TestObject
ausdehntNSObject
Derzeit ist keine Reflexion implementiert.
EDIT: Ich habe mich anscheinend geirrt, siehe stevex 'Antwort. Es gibt einige einfache schreibgeschützte Überlegungen zu eingebauten Eigenschaften, wahrscheinlich um IDEs die Möglichkeit zu geben, Objektinhalte zu überprüfen.
quelle
Es scheint, dass eine Swift Reflection API für Apple derzeit keine hohe Priorität hat. Neben der Antwort von @stevex gibt es in der Standardbibliothek noch eine weitere Funktion, die hilft.
Ab Beta 6
_stdlib_getTypeName
wird der verstümmelte Typname einer Variablen abgerufen. Fügen Sie dies in einen leeren Spielplatz ein:Die Ausgabe ist:
Der Blogeintrag von Ewan Swick hilft dabei, diese Zeichenfolgen zu entschlüsseln:
zB
_TtSi
steht für Swifts internenInt
Typ.Mike Ash hat einen großartigen Blogeintrag zum gleichen Thema .
quelle
Möglicherweise möchten Sie stattdessen toString () verwenden. Es ist öffentlich und funktioniert genauso wie _stdlib_getTypeName (), mit dem Unterschied, dass es auch auf AnyClass funktioniert , z. B. auf einem Spielplatz
quelle
Kein
reflect
Schlüsselwort in Swift 5, jetzt können Sie verwendenquelle
json
Deserialisierung anwenden