Sobes.tech
Middle

Kuidas piirata alamliike Swiftis massiivis?

sobes.tech AI

Vastus AI-lt

Swiftis ei ole võimalik otse piirata alamliike homogeensete elementide massiivides. Kuid, sarnase käitumise saavutamiseks saab kasutada järgmisi lähenemisviise:

  1. Protokolli kasutamine: Kirjeldada üldine protokoll kõigile lubatud alamliikidele ja kasutada seda massiivi elementide tüübina.

    protocol SpecificType {}
    
    class SubtypeA: SpecificType {}
    class SubtypeB: SpecificType {}
    class AnotherType {}
    
    var specificArray: [SpecificType] = [] // Massiiv, mis sisaldab ainult SpecificType'i realiseerivaid tüüpe
    
    specificArray.append(SubtypeA())
    specificArray.append(SubtypeB())
    // specificArray.append(AnotherType()) // Kompileerimisel viga, AnotherType ei vasta protokollile
    
  2. Genereikide kasutamine piiranguga protokolli järgi: Kui loote oma kogumi või funktsiooni, saate kasutada genereikuid piiranguga protokolli järgi.

    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>() // Massiiv ainult SubtypeA, mis realiseerib SpecificType
    // var invalidArray = RestrictedArray<AnotherType>() // Kompileerimisel viga, AnotherType ei vasta protokollile
    
  3. Enum kasutamine koos seotud väärtustega: Kui alamliikide arv on fikseeritud ja teada ette, saab kasutada 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())) // Tüübiviga seotud väärtuses
    

Seega, otse alamliikide piiramine standardmassiivis [SomeType] ei ole võimalik. Selle asemel kasutatakse protokolle, genereikuid piirangutega või enum'e, et tagada staatiline tübiturvalisus.