So ermitteln Sie den Typ einer Variable in Swift: Vollständige Anleitung mit Codebeispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum muss man den Typ einer Variable in Swift kennen?

\n

Haben Sie jemals Code in Swift geschrieben und sich plötzlich gefragt: "Welchen Typ hat diese Variable eigentlich?" Besonders wenn Sie mit Any, Generics oder komplexen Vererbungen arbeiten. Es ist, als würde man versuchen zu erraten, was in einer Schachtel ist, ohne sie zu öffnen. Aber Swift bietet leistungsstarke Werkzeuge, mit denen Sie hineinschauen und den Typ oder die Klasse einer Variable genau bestimmen können.

\n

In diesem Artikel werden wir untersuchen, wie Sie den Typ einer Variable in Swift ausgeben können, indem Sie type(of:), Mirror, String(describing:) und sogar das gute alte dynamicType (ja, es lebt noch in Legacy-Code) verwenden. Sie lernen nicht nur, den Typ auszugeben, sondern ihn auch in realen Projekten zu nutzen: für Debugging, Logging, Typprüfung zur Laufzeit und die Arbeit mit Protokollen.

\n

Der Artikel wurde für die Bildungswebsite pythonlib.ru verfasst und ist für Anfänger und erfahrene Entwickler gleichermaßen geeignet. Los geht's!

\n\n

1. Der einfachste Weg: type(of:)

\n

Die beliebteste und korrekteste Methode, um den Typ einer Variable in Swift zu ermitteln, ist die Verwendung der globalen Funktion type(of:). Sie gibt den Metatyp (MetaType) des übergebenen Werts zurück.

\n

Beispiel:

\n
let name = "Anna"\nlet age = 25\nlet price: Double = 99.99\nlet isActive = true\n\nprint(type(of: name))   // String\nprint(type(of: age))    // Int\nprint(type(of: price))  // Double\nprint(type(of: isActive)) // Bool\n
\n

Beachten Sie: type(of:) funktioniert mit allen Typen – Strukturen, Klassen, Aufzählungen, Closures. Sogar mit optionalen Werten:

\n
var optionalValue: String? = "Hallo"\nprint(type(of: optionalValue)) // Optional<String>\n
\n\n

Warum ist type(of:) die beste Wahl?

\n
    \n
  • Funktioniert mit Wertetypen (Strukturen, Aufzählungen) und Referenztypen (Klassen).
  • \n
  • Unterstützt Protokolle und Generics.
  • \n
  • Erfordert keine explizite Typangabe im Code.
  • \n
  • Gibt den genauen dynamischen Typ zurück (berücksichtigt Vererbung).
  • \n
\n\n

2. Die klassische Methode: String(describing:)

\n

Manchmal müssen Sie den Typ nicht nur ermitteln, sondern ihn für die Ausgabe in ein Log oder eine Benutzeroberfläche in einen String umwandeln. String(describing:) meistert diese Aufgabe hervorragend:

\n
let value: Any = 42\nprint(String(describing: type(of: value))) // Int\n
\n

Sie können es mit type(of:) kombinieren, um ein schönes Logging zu erhalten:

\n
func logType(_ value: Any) {\n    let typeName = String(describing: type(of: value))\n    print("[LOG] Typ: \\(typeName), Wert: \\(value)")\n}\nlogType(3.14)  // [LOG] Typ: Double, Wert: 3.14\n
\n\n

3. Arbeiten mit Klassen: dynamicType und Mirror

\n

Vor Swift 3 wurde die Eigenschaft dynamicType verwendet. Sie ist aus Gründen der Abwärtskompatibilität noch verfügbar, aber offiziell veraltet. Sie können ihr jedoch in älteren Projekten begegnen:

\n
class Animal {}\nclass Dog: Animal {}\n\nlet pet: Animal = Dog()\nprint(pet.dynamicType) // Dog (veraltete Syntax)\n
\n

Der moderne Ersatz ist type(of:):

\n
print(type(of: pet)) // Dog\n
\n\n

Mirror: Tiefer eintauchen

\n

Wenn Sie nicht nur den Typ, sondern auch die Struktur eines Objekts (z. B. Eigenschaftsnamen) ermitteln müssen, verwenden Sie Mirror:

\n
struct User {\n    let name: String\n    let age: Int\n}\n\nlet user = User(name: "Ivan", age: 30)\nlet mirror = Mirror(reflecting: user)\nprint(mirror.subjectType) // User\nfor child in mirror.children {\n    print("\\(child.label ?? ""): \\(child.value) (\\(type(of: child.value)))")\n}\n// Ausgabe:\n// name: Ivan (String)\n// age: 30 (Int)\n
\n

Dies ist besonders nützlich für das Debuggen komplexer Hierarchien oder bei der Arbeit mit Reflexion.

\n\n

4. Bestimmung der Klasse für Any und AnyObject

\n

In Swift trifft man häufig auf den Typ Any – er kann einen Wert jeden Typs speichern. Um den konkreten Typ zu ermitteln

Blogs

Buchempfehlungen