Sobes.tech
Middle

Wie beschränkt man Untertypen in einem Array in Swift?

sobes.tech KI

Antwort von AI

In Swift ist es nicht möglich, Untertypen direkt in Arrays mit homogener Elementtyp zu beschränken. Es ist jedoch möglich, ein ähnliches Verhalten mit den folgenden Ansätzen zu erreichen:

  1. Verwendung von Protokollen: Definieren Sie ein allgemeines Protokoll für alle erlaubten Untertypen und verwenden Sie es als Elementtyp des Arrays.

    protocol SpecificType {}
    
    class SubtypeA: SpecificType {}
    class SubtypeB: SpecificType {}
    class AnotherType {}
    
    var specificArray: [SpecificType] = [] // Array, das nur Typen enthält, die SpecificType implementieren
    
    specificArray.append(SubtypeA())
    specificArray.append(SubtypeB())
    // specificArray.append(AnotherType()) // Kompilierungsfehler, AnotherType entspricht dem Protokoll nicht
    
  2. Verwendung von Generics mit Protokollbeschränkung: Wenn Sie eine eigene Sammlung oder Funktion erstellen, können Sie Generics mit Protokollbeschränkung verwenden.

    struct RestrictedArray<T: SpecificType> {
        private var elements: [T] = []
    
        mutating func append(_ element: T) {
            elements.append(element)
        }
    
        func getElements() -> [T] {
            return elements
        }
    }
    
    // var validArray = RestrictedArray<SubtypeA>() // Array nur von SubtypeA, die SpecificType implementieren
    // var invalidArray = RestrictedArray<AnotherType>() // Kompilierungsfehler, AnotherType entspricht dem Protokoll nicht
    
  3. Verwendung von Aufzählungen (Enum) mit assoziierten Werten: Wenn die Anzahl der Untertypen fest und im Voraus bekannt ist, kann eine Aufzählung verwendet werden.

    enum AllowedSubtypes {
        case typeA(SubtypeA)
        case typeB(SubtypeB)
    }
    
    class SubtypeA {}
    class SubtypeB {}
    
    var enumArray: [AllowedSubtypes] = []
    
    enumArray.append(.typeA(SubtypeA()))
    enumArray.append(.typeB(SubtypeB()))
    // enumArray.append(.typeA(SubtypeB())) // Typfehler innerhalb des assoziierten Werts
    

Daher ist die direkte Einschränkung von Untertypen in einem Standard-Array [SomeType] nicht möglich. Stattdessen werden Protokolle, Generics mit Beschränkungen oder Aufzählungen verwendet, um die statische Typsicherheit zu gewährleisten.