Sobes.tech
Middle

Comment limiter les sous-types dans un tableau en Swift?

sobes.tech IA

Réponse de l'IA

En Swift, il n’est pas possible de restreindre directement les sous-types dans des tableaux avec des types homogènes d’éléments. Cependant, on peut obtenir un comportement similaire en utilisant les approches suivantes :

  1. Utilisation de protocoles : Définir un protocole général pour tous les sous-types autorisés et l’utiliser comme type des éléments du tableau.

    protocol SpecificType {}
    
    class SubtypeA: SpecificType {}
    class SubtypeB: SpecificType {}
    class AnotherType {}
    
    var specificArray: [SpecificType] = [] // Tableau contenant uniquement des types qui respectent SpecificType
    
    specificArray.append(SubtypeA())
    specificArray.append(SubtypeB())
    // specificArray.append(AnotherType()) // Erreur de compilation, AnotherType ne respecte pas le protocole
    
  2. Utilisation de génériques avec restriction par protocole : Si vous créez une collection ou une fonction personnalisée, vous pouvez utiliser des génériques avec restriction par protocole.

    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>() // Tableau uniquement de SubtypeA respectant SpecificType
    // var invalidArray = RestrictedArray<AnotherType>() // Erreur de compilation, AnotherType ne respecte pas le protocole
    
  3. Utilisation d’énumérations (Enum) avec valeurs associées : Si le nombre de sous-types est fixe et connu à l’avance, on peut utiliser une énumération.

    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())) // Erreur de type dans la valeur associée
    

Ainsi, la restriction directe des sous-types dans un tableau [SomeType] standard n’est pas possible. À la place, on utilise des protocoles, des génériques avec restrictions ou des énumérations pour assurer la sécurité statique des types.