Sobes.tech
Middle

Jak omezit podtypy v poli ve Swiftu?

sobes.tech AI

Odpověď od AI

V jazyce Swift není možné přímo omezit podtypy v polích s homogenním typem prvků. Nicméně, lze dosáhnout podobného chování pomocí následujících přístupů:

  1. Použití protokolů: Definujte obecný protokol pro všechny povolené podtypy a použijte ho jako typ prvků pole.

    protocol SpecificType {}
    
    class SubtypeA: SpecificType {}
    class SubtypeB: SpecificType {}
    class AnotherType {}
    
    var specificArray: [SpecificType] = [] // Pole obsahující pouze typy implementující SpecificType
    
    specificArray.append(SubtypeA())
    specificArray.append(SubtypeB())
    // specificArray.append(AnotherType()) // Chyba při kompilaci, AnotherType neodpovídá protokolu
    
  2. Použití generik s omezením přes protokol: Pokud vytváříte vlastní kolekci nebo funkci, můžete použít generika s omezením přes protokol.

    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>() // Pole pouze s SubtypeA, které implementuje SpecificType
    // var invalidArray = RestrictedArray<AnotherType>() // Chyba při kompilaci, AnotherType neodpovídá protokolu
    
  3. Použití enum s asociovanými hodnotami: Pokud je počet podtypů pevně stanoven a znám předem, lze použít enum.

    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())) // Chyba typu uvnitř přiřazené hodnoty
    

Tímto způsobem není možné přímo omezit podtypy v běžném [SomeType] poli. Místo toho se používají protokoly, generika s omezeními nebo enumy k zajištění statické typové bezpečnosti.