Wenn Sie versuchen, ein Programm zu verstehen, oder in einigen Fällen, ist es hilfreich, tatsächlich herauszufinden, um welchen Typ es sich handelt. Ich weiß, dass der Debugger Ihnen einige Typinformationen anzeigen kann, und Sie können sich normalerweise auf Typinferenz verlassen, um nicht den Typ in solchen Situationen anzugeben, aber dennoch hätte ich wirklich gerne etwas wie Pythonstype()
dynamicType (siehe diese Frage )
Update: Dies wurde in einer neueren Version von Swift geändert und enthält obj.dynamicType
nun einen Verweis auf den Typ und nicht auf die Instanz des dynamischen Typs.
Dieser scheint der vielversprechendste zu sein, aber bisher konnte ich den tatsächlichen Typ nicht herausfinden
class MyClass {
var count = 0
}
let mc = MyClass()
# update: this now evaluates as true
mc.dynamicType === MyClass.self
Ich habe auch versucht, eine Klassenreferenz zu verwenden, um ein neues Objekt zu instanziieren, was funktioniert , aber seltsamerweise habe ich einen Fehler erhalten, der besagt, dass ich einen required
Initialisierer hinzufügen muss :
funktioniert:
class MyClass {
var count = 0
required init() {
}
}
let myClass2 = MyClass.self
let mc2 = MyClass2()
Trotzdem nur ein kleiner Schritt, um den Typ eines bestimmten Objekts tatsächlich zu entdecken
Bearbeiten : Ich habe eine beträchtliche Anzahl von jetzt irrelevanten Details entfernt - schauen Sie sich den Bearbeitungsverlauf an, wenn Sie interessiert sind :)
quelle
print(mc)
oderdump(mc)
druckt eine Zusammenfassung (die Sie vontoString(mc)
oder erhalten könnenreflect(mc).summary
), die irgendwo den Klassennamen enthält. Es ist jedoch nicht klar, wie Sie selbst nur den Klassennamen erhalten.Antworten:
Swift 3 Version:
quelle
var myVar: SomeType!
. Der Compiler gibt den Fehler "Der Wert vom Typ 'SomeType! .Type' (auch bekannt als 'ImplicitlyUnwrappedOptional <SomeType> .Type') kann nicht in den erwarteten Argumenttyp 'AnyClass' (auch bekannt als 'AnyObject.Type') konvertiert werden. Der Compiler schlägt jedoch vor,as! AnyClass
nach dem Typ hinzuzufügen Programm stürzt mit einigen "EXC_BAD_INSTRUCTION" und anderen Jiberrish ab, die ich nicht entziffern kann.String
die als Typ geleitet wirdAny
danntype(of:)
ausgeben wirdAny
, nichtString
.Swift 2.0:
Der richtige Weg, um diese Art der Typ-Selbstbeobachtung durchzuführen , wäre die Mirror-Struktur .
Mirror
Um dann über die Struktur auf den Typ selbst zuzugreifen, verwenden Sie die EigenschaftsubjectType
wie folgt:Sie können dann so etwas verwenden:
quelle
String
undOptional(String)
sind nicht gleich.Der
dynamicType.printClassName
Code stammt aus einem Beispiel im Swift-Buch. Es gibt keine Möglichkeit, einen benutzerdefinierten Klassennamen direkt abzurufen, aber Sie können einen Instanztyp mithilfe desis
unten gezeigten Schlüsselworts überprüfen . Dieses Beispiel zeigt auch, wie eine benutzerdefinierte className-Funktion implementiert wird, wenn der Klassenname wirklich als Zeichenfolge verwendet werden soll.Hinweis: Diese
Unterklassen
NSObject
implementieren bereits ihre eigene className-Funktion. Wenn Sie mit Kakao arbeiten, können Sie diese Eigenschaft einfach verwenden.quelle
subjectType
ist es nicht mehr verfügbar unddynamicType
verursacht eine Verfallsmeldung vom Compiler.Ab Xcode 6.0.1 (zumindest nicht sicher, wann sie hinzugefügt wurden) funktioniert Ihr ursprüngliches Beispiel jetzt:
Aktualisieren:
Um die ursprüngliche Frage zu beantworten, können Sie die Objective-C-Laufzeit tatsächlich erfolgreich mit einfachen Swift-Objekten verwenden.
Versuche Folgendes:
quelle
Wenn Sie einfach nur überprüfen müssen , ob die Variable vom Typ X sind, oder dass es bis zu einem gewissen Protokoll entspricht, dann können Sie verwenden
is
, oder ,as?
wie im Folgenden:Dies entspricht dem
isKindOfClass
in Obj-C.Und das ist gleichbedeutend mit
conformsToProtocol
oderisMemberOfClass
quelle
as?
bedingter Besetzung macht dasselbe wieisKindOfClass
auch, liefert nur das Ergebnis der Besetzung, falls sie erfolgreich sein sollte.isMemberOfClass
ist die Bedingungobject.dynamicType == ClassName.self
.Swift 3:
quelle
is
existiert vor Swift 3 ...?Für Swift 3.0
Für Swift 2.0 - 2.3
quelle
Hier sind zwei Möglichkeiten, die ich empfehle:
Oder:
Hier ist ein detailliertes Beispiel:
quelle
print( aShape is Square )
,is
Betreiber ist stärker bevorzugt.Kommt auf den Anwendungsfall an. Nehmen wir jedoch an, Sie möchten mit Ihren "variablen" Typen etwas Nützliches tun. Die Swift-
switch
Aussage ist sehr mächtig und kann Ihnen helfen, die gewünschten Ergebnisse zu erzielen ...In diesem Fall verfügen Sie über ein einfaches Wörterbuch, das Schlüssel / Wert-Paare enthält, die UInt, Int oder String sein können. Bei der
.filter()
Methode im Wörterbuch muss ich sicherstellen, dass ich die Werte korrekt teste und nur dann auf einen String teste, wenn es sich um einen String usw. handelt. Die switch-Anweisung macht dies einfach und sicher! Durch Zuweisen von 9 zur Variablen vom Typ Any wird der Schalter für Int ausgeführt. Versuchen Sie es zu ändern in:..und versuchen Sie es erneut. Diesmal wird der
as String
Fall ausgeführt.quelle
Wenn Sie die Warnung "Immer wahr / fehlgeschlagen" erhalten, müssen Sie diese möglicherweise vor der Verwendung in "Beliebig" umwandeln
is
quelle
quelle