Opaque Type: Was es ist, some und any in Swift

Autor: IT Sectr Veröffentlicht: 2026-06-18 Lesezeit: 11 Min.

Opaque Type ist ein Swift-Mechanismus, der es einer Funktion ermöglicht, einen Wert eines bestimmten Typs zurückzugeben, ohne den konkreten Typ dem aufrufenden Code zu offenbaren. Das Schlüsselwort some im Rückgabetyp ist das bekannteste Beispiel: some View in SwiftUI bedeutet „die Funktion gibt einen Typ zurück, der View entspricht, aber welcher genau ist ein Implementierungsdetail.” Ein opaque type bewahrt die Typidentität (im Gegensatz zu einem Protokoll als Typ), was dem Compiler ermöglicht, den Code zu optimieren und die Konsistenz des zurückgegebenen Typs zu garantieren. Laut Swift Book, 2025 lösen opaque types das Problem von Protokollen mit assoziierten Typen, indem sie es ermöglichen, Werte solcher Protokolle aus Funktionen zurückzugeben.

Wichtige Punkte

  • Opaque Type — ein Rückgabetyp, der die konkrete Implementierung vor dem aufrufenden Code verbirgt
  • some — das Schlüsselwort zum Deklarieren eines opaque type in Rückgabeposition
  • Typidentität bleibt erhalten: Der Compiler kennt den konkreten Typ, anders als bei any
  • SwiftUI verwendet some View als Standardmethode zur Deklaration von body
  • Einschränkung: Eine Funktion mit some muss aus allen Zweigen denselben konkreten Typ zurückgeben

Was ist ein Opaque Type in Swift?

Opaque Type ist ein Rückgabetyp, der mit dem Schlüsselwort some deklariert wird und die konkrete Implementierung vor dem aufrufenden Code verbirgt. Der Aufrufer weiß nur, dass der zurückgegebene Wert einem bestimmten Protokoll entspricht, aber nicht, welcher Typ genau hinter some steckt. Der Compiler hingegen kennt den genauen Typ und verwendet ihn für statischen Dispatch und Optimierung.

Das Problem, das Opaque Type löst

Vor der Einführung von opaque types in Swift 5.1 (SE-0244) war es unmöglich, ein Protokoll mit assoziierten Typen aus einer Funktion ohne einen Boxing-Wrapper zurückzugeben. Beispielsweise hat das Equatable-Protokoll einen assoziierten Typ, und eine Funktion konnte nicht einfach Equatable zurückgeben — der Compiler gab einen Fehler aus „Protokoll kann nur als generische Einschränkung verwendet werden.” Opaque type löste dieses Problem.

swift
func makeInt() -> some Equatable {
    return 42
}

func makeString() -> some Equatable {
    return "Hello"
}

// Compiler weiß, dass makeInt Int zurückgibt
// makeInt() == makeString() — ❌ Fehler, unterschiedliche Typen

Beide Funktionen geben some Equatable zurück, aber die konkreten Typen sind unterschiedlich: Int und String. Der Versuch, sie mit == zu vergleichen, verursacht einen Kompilierungsfehler, da ein opaque type garantiert, dass ein bestimmter Aufruf denselben Typ zurückgibt, aber nicht zwischen verschiedenen Funktionen. Dies ist eine Funktion, kein Fehler: opaque type bewahrt die Typidentität dort, wo ein Protokoll als Typ (any Equatable) sie verliert.

Opaque Type vs Generic: Was ist der Unterschied

Generic und Opaque Type sind zwei Seiten derselben Medaille. Generics ermöglichen es dem aufrufenden Code, den Typ zu wählen, während opaque type der Funktion ermöglicht, den Typ vor dem aufrufenden Code zu verbergen. Der Unterschied liegt in der Richtung der Kontrolle.

EigenschaftGeneric Opaque some
Wer wählt den TypAufrufender CodeFunktion/Methode
TypidentitätErhalten (stabil)Erhalten (stabil)
Anzahl der RückgabezweigeEiner (durch Generic)Gleicher Typ in allen Zweigen
VerwendungAlgorithmen, DatenstrukturenSwiftUI, Factory-Methoden

Generic — Wahl von außen

In einer generischen Funktion entscheidet der Aufrufer, welcher Typ verwendet wird. Die Funktion muss mit jedem T arbeiten, das die Einschränkungen erfüllt. Bei opaque type kennt der Aufrufer den konkreten Typ nicht — die Implementierung trifft die Entscheidung.

swift
// Generic: Der Aufrufer wählt den Typ
func identity<T>(_ value: T) -> T { value }
let x: Int = identity(42)

// Opaque: Die Funktion verbirgt den Typ
func makeSomeEquatable() -> some Equatable { 42 }
let y = makeSomeEquatable()

Die Wahl zwischen generic und opaque type hängt von der Absicht ab. Wenn der aufrufende Code den Typ wählen soll, verwenden Sie Generics. Wenn die Funktion Implementierungsdetails verbergen soll, verwenden Sie some. SwiftUI hat some View genau deshalb gewählt, weil body intern flexibel, aber extern stabil sein sollte.

Das Schlüsselwort some und seine Verwendung

some ist ein Swift-Schlüsselwort, das in Swift 5.1 (SE-0244) eingeführt wurde. Es wird in Rückgabeposition verwendet, um einen opaque type zu deklarieren, sowie in Parametern (SE-0341) und Eigenschaften. some garantiert, dass der konkrete Typ stabil und dem Compiler bekannt, aber vor externem Code verborgen ist.

some in Funktionsparametern

Ab Swift 5.7 kann some nicht nur in Rückgabeposition, sondern auch in Parametern verwendet werden. some Equatable in einem Parameter bedeutet „diese Funktion akzeptiert jeden Equatable-Typ, aber alle Aufrufe innerhalb eines bestimmten Körpers sehen denselben Typ.”

swift
func areEqual(_ a: some Equatable, _ b: some Equatable) -> Bool {
    // a und b — potenziell unterschiedliche Typen, == funktioniert nicht direkt
    return isEqual(a, b)
}

func isEqual<T: Equatable>(_ a: T, _ b: T) -> Bool {
    return a == b
}

Die Verwendung von some in Parametern bietet eine prägnantere Syntax im Vergleich zu . Es ist besonders nützlich bei Protokollen und protokollorientiertem Design, wo jede Verwendung eines Protokolls keinen separaten generischen Parameter erfordert. Der Compiler wandelt some-Parameter intern in Generics um, sodass die Leistung identisch ist.

Das Schlüsselwort any und existenzielle Typen

any ist ein Swift 5.6+-Schlüsselwort zur expliziten Deklaration existenzieller Typen (Protokoll als Typ). Anders als some löscht any die Typidentität: Der Compiler weiß nicht, welcher konkrete Typ hinter dem Protokoll steckt. Dies bietet Flexibilität (Sie können verschiedene Typen in einem einzelnen Array speichern), jedoch auf Kosten der Leistung.

some vs any: Vergleichende Analyse

some — statischer Polymorphismus: Der Compiler kennt den konkreten Typ, verwendet direkten Dispatch und kann Code inline einfügen. any — dynamischer Polymorphismus: Eine virtuelle Methodentabelle (existenzieller Container) wird verwendet, was Indirektion hinzufügt.

swift
protocol Drawable {
    func draw()
}

// some: Der statische Typ ist bekannt
func makeDrawable() -> some Drawable {
    return Circle() // Einzelner Rückgabetyp
}

// any: Dynamisch, kann verschiedene Typen speichern
var shapes: [any Drawable] = [Circle(), Square()]
shapes.append(Triangle())

Die Wahl zwischen some und any ist ein Kompromiss zwischen Leistung und Flexibilität. Some ist schneller, beschränkt sich jedoch auf eine einzige Implementierung. Any ist flexibler (Sie können Typen mischen), aber aufgrund des dynamischen Dispatches langsamer. In SwiftUI verwendet body immer some View, weil der body jedes View ein konkreter Typ ist.

Opaque Type in Protokollen mit assoziierten Typen

Opaque Type löst ein fundamentales Problem von Swift: Protokolle mit assoziierten Typen (PAT) können nicht direkt als Typ verwendet werden. Eine Funktion kann nicht einfach Collection zurückgeben — der Compiler verlangt die Angabe von Element. some Collection löst dies, indem es den assoziierten Typ verbirgt.

Rückgabe von PAT durch some

Ohne opaque type müsste man zur Rückgabe einer Collection einen konkreten Typ (Array) oder Type Erasure (AnyCollection) verwenden. some Collection bietet einen Mittelweg: Der Compiler kennt die konkrete Implementierung, der aufrufende Code nicht.

swift
func makeReversedCollection<T>(
    of array: [T]
) -> some Collection {
    return array.reversed()
}

let result = makeReversedCollection(of: [1, 2, 3])
// result — ReversedCollection>, hidden from caller
for item in result {
    print(item)
}

result kann iteriert werden, aber Sie können nicht direkt auf die Eigenschaften von ReversedCollection zugreifen. Dies schützt die Kapselung: Wenn Sie später reversed() durch eine andere Methode mit einer anderen Implementierung ersetzen, wird der aufrufende Code nicht brechen. Opaque type gibt Ihnen die Freiheit, die Implementierung zu ändern, ohne die API zu ändern.

Praktische Beispiele von some View in SwiftUI

some View ist die bekannteste Verwendung von opaque type. Jedes View in SwiftUI deklariert body als some View. Dies bedeutet, dass body einen konkreten View-Typ zurückgibt, aber der Entwickler nicht darüber nachdenken muss, was genau es ist — TupleView, Group, ModifiedContent oder ein anderer Typ aus dem Framework.

Wie SwiftUI some View verwendet

Ohne opaque type müsste body einen konkreten Typ zurückgeben, zum Beispiel ModifiedContent<Button<Text>, Padding>, was unpraktisch ist. some View verbirgt diese Komplexität. Der Compiler leitet den genauen Typ von body automatisch zur Kompilierzeit ab.

swift
struct ContentView: View {
    var body: some View {
        VStack {
            Text("Hallo")
                .font(.title)
            Button("Tippe mich") {
                print("Getippt")
            }
        }
        .padding()
    }
}

Der Compiler leitet body als ModifiedContent<VStack<TupleView<(Text, Button<Text>)>>, Padding> ab. Der Entwickler sieht some View. Wenn Sie das Layout von VStack auf HStack ändern, wird der Compiler den Typ automatisch neu ableiten — keine manuellen Bearbeitungen erforderlich. Das ist die Magie von opaque type: Der Entwickler konzentriert sich auf die Logik der Benutzeroberfläche, nicht auf die Kompositionstypen.

Häufig gestellte Fragen

Was ist ein Opaque Type in Swift?

Opaque Type ist ein mit dem Schlüsselwort some deklarierter Typ, der die konkrete Implementierung vor dem aufrufenden Code verbirgt. Der Compiler kennt den genauen Typ, aber der Entwickler, der die Funktion verwendet, sieht nur das Protokoll.

Wie unterscheidet sich some von any in Swift?

some ist ein opaque type mit statischer Identität: Der Compiler kennt den konkreten Typ. any ist ein existenzieller Typ mit dynamischem Dispatch: Die Typidentität wird gelöscht. Some ist leistungsfähiger, any ist flexibler.

Warum verwendet SwiftUI some View?

some View verbirgt den komplexen konkreten Typ von body, den der Compiler automatisch ableitet. Dies befreit den Entwickler davon, den genauen Typ schreiben zu müssen, der aus generischen Wrappern (VStack, Group, ModifiedContent) besteht.

Kann some in Funktionsparametern verwendet werden?

Ja, ab Swift 5.7. Some in Parametern ist syntaktischer Zucker für einen generischen Parameter. Es vereinfacht Funktionsdeklarationen, besonders bei der Arbeit mit Protokollen, wo jeder some-Parameter kein separates erfordert.

Was passiert, wenn verschiedene Typen von einer some-Funktion zurückgegeben werden?

Der Compiler gibt einen Fehler aus: Opaque type erfordert, dass alle Rückgabezweige denselben konkreten Typ zurückgeben. Dies ist beabsichtigt, um die Typidentität zu bewahren. Wenn Sie verschiedene Typen zurückgeben müssen, verwenden Sie any.

Zusammenfassung

  • Opaque Type — verbirgt den konkreten Typ des Rückgabewerts unter Bewahrung seiner Identität auf Compiler-Ebene
  • Das Schlüsselwort some wird verwendet, um einen opaque type in Rückgabeposition und Parametern zu deklarieren
  • Generic vs Opaque: Der Aufrufer wählt den Typ für generic, die Implementierung wählt für opaque
  • any — existenzieller Typ mit dynamischem Dispatch, some — statischer Polymorphismus
  • SwiftUI some View — der Hauptanwendungsfall: Verbirgt den komplexen body-Typ vor dem Entwickler
  • Opaque type löst das Problem der Rückgabe von Protokollen mit assoziierten Typen (PAT) aus Funktionen

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch