Sobes.tech
Middle

Kā ierobežot apakštipus Swift masīvā?

sobes.tech AI

Atbilde no AI

Swift valodā nav tieši ierobežot apakštipus masīvos ar viendabīgu elementu tipu. Tomēr, ir iespējams sasniegt līdzīgu uzvedību, izmantojot šādus pieejas:

  1. Protokola izmantošana: Definēt kopēju protokolu visiem atļautajiem apakštipiem un izmantot to kā masīva elementu tipu.

    protocol SpecificType {}
    
    class SubtypeA: SpecificType {}
    class SubtypeB: SpecificType {}
    class AnotherType {}
    
    var specificArray: [SpecificType] = [] // Masīvs, kas satur tikai tipus, kas realizē SpecificType
    
    specificArray.append(SubtypeA())
    specificArray.append(SubtypeB())
    // specificArray.append(AnotherType()) // Kompilācijas kļūda, AnotherType neatbilst protokolam
    
  2. Gēnu izmantošana ar protokola ierobežojumu: Ja veidojat savu kolekciju vai funkciju, var izmantot ģenērus ar protokola ierobežojumu.

    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>() // Tikai SubtypeA, kas realizē SpecificType
    // var invalidArray = RestrictedArray<AnotherType>() // Kompilācijas kļūda, AnotherType neatbilst protokolam
    
  3. Enum izmantošana ar saistītajām vērtībām: Ja apakštipu skaits ir fiksēts un zināms iepriekš, var izmantot 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())) // Tipa kļūda saistītajā vērtībā
    

Tādējādi, tieša apakštipu ierobežošana standarta masīvā [SomeType] nav iespējama. Tā vietā tiek izmantoti protokoli, ģenēri ar ierobežojumiem vai enumi, lai nodrošinātu statisku tipu drošību.