Sobes.tech
Middle

Ako obmedziť podtypy v poli v Swift?

sobes.tech AI

Odpoveď od AI

V jazyku Swift nie je možné priamo obmedziť podtypy pre polia s homogénnym typom prvkov. Avšak, je možné dosiahnuť podobné správanie pomocou nasledujúcich prístupov:

  1. Použitie protokolu: Opísať všeobecný protokol pre všetky povolené podtypy a použiť ho ako typ prvkov poľa.

    protocol SpecificType {}
    
    class SubtypeA: SpecificType {}
    class SubtypeB: SpecificType {}
    class AnotherType {}
    
    var specificArray: [SpecificType] = [] // Pole obsahujúce iba typy implementujúce SpecificType
    
    specificArray.append(SubtypeA())
    specificArray.append(SubtypeB())
    // specificArray.append(AnotherType()) // Chyba kompilácie, AnotherType nevyhovuje protokolu
    
  2. Použitie generík s obmedzením podľa protokolu: Ak vytvárate vlastnú kolekciu alebo funkciu, môžete použiť generiká s obmedzením podľa protokolu.

    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 iba SubtypeA, implementujúcich SpecificType
    // var invalidArray = RestrictedArray<AnotherType>() // Chyba kompilácie, AnotherType nevyhovuje protokolu
    
  3. Použitie enum s asociovanými hodnotami: Ak je počet podtypov pevne stanovený a známy vopred, môžete použiť 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 v rámci asociovanej hodnoty
    

Takže, priame obmedzenie podtypov v štandardnom poli [SomeType] nie je možné. Namiesto toho sa používajú protokoly, generiká s obmedzeniami alebo enumy na zabezpečenie statickej typovej bezpečnosti.