0Pricing
Swift Academy · Lektion

Erzwungenes Casting mit as! und seine Risiken

Verwenden Sie as! nur, wenn das Casting garantiert erfolgreich ist.

Erzwungenes Casting mit as! und seine Risiken ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Erzwungenes Casting

Der Operator für das erzwungene Casting, as!, führt Downcasting und Entpacken in einem Schritt durch. Er liefert direkt den Nicht-Optional-Typ, verursacht aber einen Absturz, wenn der Cast fehlschlägt.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
let dog = a as! Dog
print(dog.bark())

Kein Verpacken in ein Optional

Im Gegensatz zu as? ist das Ergebnis von as! ein einfacher Typ und kein Optional. Es muss nichts entpackt werden.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
let dog: Dog = a as! Dog
print(type(of: dog))

Das Risiko von as!

Wenn die Instanz nicht tatsächlich vom Zieltyp ist, löst as! zur Laufzeit einen Fehler aus und beendet das Programm. Eine Wiederherstellung ist nicht möglich.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
// let cat = a as! Cat  // would crash at runtime
print("Only force-cast when certain")

Wann erzwungenes Casting sicher ist

Verwenden Sie as! nur, wenn Sie absolut sicher sind, dass der Typ stimmt, etwa direkt nach einer Prüfung mit is.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
if a is Dog {
    let dog = a as! Dog
    print(dog.bark())
}

Erzwungenes Casting nach einer Garantie

Wenn die Logik Ihres Codes den Typ garantiert, dokumentiert ein erzwungener Cast diese Gewissheit. Verwenden Sie bei Unsicherheit dennoch bevorzugt as?.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
func barkIfDog(_ a: Animal) {
    guard a is Dog else { return }
    let dog = a as! Dog
    print(dog.bark())
}
barkIfDog(Dog(name: "Rex"))

as? und as! vergleichen

as? ist sicher und gibt ein Optional zurück; as! erzwingt den Cast und verursacht bei einem Fehlschlag einen Absturz. Entscheiden Sie anhand Ihrer Gewissheit, welchen Operator Sie verwenden.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
let safe = a as? Dog
let forced = a as! Dog
print(safe?.bark() ?? "nil")
print(forced.bark())

Sammlungen erzwungen casten

Erzwungene Casts funktionieren auch für ganze Sammlungen, etwa mit array as! [Dog]. Das gleiche Absturzrisiko gilt jedoch für jedes Element.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let animals: [Animal] = [Dog(name: "Rex"), Dog(name: "Buddy")]
let dogs = animals as! [Dog]
for d in dogs { print(d.bark()) }

Ein gefährliches Muster

Das erzwungene Casten eines Arrays, das ein falsches Element enthält, verursacht einen Absturz. Deshalb sollten Sie bei gemischten Sammlungen jedes Element mit as? einzeln prüfen.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let animals: [Animal] = [Dog(name: "Rex"), Cat(name: "Mia")]
// let dogs = animals as! [Dog] // would crash on the Cat
for a in animals {
    if let d = a as? Dog { print(d.bark()) }
}

Erzwungenes Entpacken und erzwungenes Casting

Das ! in as! funktioniert konzeptionell ähnlich wie das erzwungene Entpacken eines Optionals: Es ist praktisch, aber gefährlich, wenn die Annahme nicht stimmt.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
let viaOptional = (a as? Dog)!
let viaForce = a as! Dog
print(viaOptional.name, viaForce.name)

Bewährte Vorgehensweise

Verwenden Sie standardmäßig as?. Setzen Sie as! nur ein, wenn ein Fehlschlag auf einen Programmierfehler hinweisen würde, den Sie während der Entwicklung sofort sichtbar machen möchten.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
func process(_ a: Animal) -> String {
    if let d = a as? Dog { return d.bark() }
    return "not a dog"
}
print(process(Dog(name: "Rex")))
print(process(Cat(name: "Mia")))

Beispiel für erzwungenes Casting

Wenn der Typ überprüft wurde, ist as! übersichtlich. Im Zweifel ist das sichere bedingte Casting das richtige Werkzeug.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let known: Animal = Dog(name: "Rex")
if known is Dog {
    print((known as! Dog).bark())
}

Kurztest

Überlegen Sie, welche Gefahren erzwungenes Casting birgt.

Zusammenfassung: Erzwungenes Casting und seine Risiken

Sie haben gelernt, dass as! ein Downcasting durchführt und zu einem Nicht-Optional-Typ entpackt, bei einem Fehlschlag aber einen Absturz verursacht. Es sollte nur verwendet werden, wenn der Typ sicher feststeht, häufig nach einer is-Prüfung. as? bleibt die sicherere Standardwahl.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
if a is Dog { print((a as! Dog).bark()) } else { print("safe skip") }

Häufig gestellte Fragen

Ist die Lektion „Erzwungenes Casting mit as! und seine Risiken“ kostenlos?

Ja — der vollständige Text von „Erzwungenes Casting mit as! und seine Risiken“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Erzwungenes Casting mit as! und seine Risiken“?

Verwenden Sie as! nur, wenn das Casting garantiert erfolgreich ist. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Swift Academy zu starten?

Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Erzwungenes Casting mit as! und seine Risiken“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?

Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Grundlagen von Upcasting und Downcasting
  2. Bedingtes Casting mit as?
  3. Erzwungenes Casting mit as! und seine Risiken
  4. Typen mit is prüfen
← Zurück zu Swift Academy