Sobes.tech
Middle

Kako ograničiti podtipove u nizu u Swift-u?

sobes.tech АИ

Одговор од АИ

U Swift-u, nije moguće direktno ograničiti podtipove u nizovima sa homogenim tipom elemenata. Međutim, možete postići sličan behavior koristeći sledeće pristupe:

  1. Korišćenje protokola: Definišite opšti protokol za sve dozvoljene podtipove i koristite ga kao tip elemenata niza.

    protocol SpecificType {}
    
    class SubtypeA: SpecificType {}
    class SubtypeB: SpecificType {}
    class AnotherType {}
    
    var specificArray: [SpecificType] = [] // Niz koji sadrži samo tipove koji implementiraju SpecificType
    
    specificArray.append(SubtypeA())
    specificArray.append(SubtypeB())
    // specificArray.append(AnotherType()) // Greška pri kompilaciji, AnotherType ne odgovara protokolu
    
  2. Korišćenje generičkih sa ograničenjem putem protokola: Ako kreirate sopstvenu kolekciju ili funkciju, možete koristiti generike sa ograničenjem putem protokola.

    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>() // Niz samo od SubtypeA koji implementira SpecificType
    // var invalidArray = RestrictedArray<AnotherType>() // Greška pri kompilaciji, AnotherType ne odgovara protokolu
    
  3. Korišćenje enumeracije (enum) sa povezanim vrednostima: Ako je broj podtipova fiksan i poznat unapred, možete koristiti 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())) // Greška tipa unutar povezane vrednosti
    

Takođe, direktno ograničenje podtipova u standardnom [SomeType] nizu nije moguće. Umesto toga, koriste se protokoli, generici sa ograničenjima ili enumi za obezbeđivanje statičke tipne sigurnosti.