Sobes.tech
Middle

როგორ შევზღუდოთ ქვესახეები Swift-ში მასივში?

sobes.tech AI

პასუხი AI-სგან

Swift телендә бертөрле элементлар тибындагы массивлар өчен турыдан-туры подтипларны чикләү мөмкин түгел. Әмма, шундый ук тәртипкә китерү өчен түбәндәге ысулларны кулланырга мөмкин:

  1. Прококолны куллану: Барлык рөхсәт ителгән подтиплар өчен гомуми прококолны билгеләгез һәм аны массив элементлары тибы итеп кулланыгыз.

    protocol SpecificType {}
    
    class SubtypeA: SpecificType {}
    class SubtypeB: SpecificType {}
    class AnotherType {}
    
    var specificArray: [SpecificType] = [] // SpecificType үтәүче типларны гына эченә алган массив
    
    specificArray.append(SubtypeA())
    specificArray.append(SubtypeB())
    // specificArray.append(AnotherType()) // Компиляция хатасы, AnotherType прококолны үтәми
    
  2. Прококол белән чикләнгән гениралыктарны куллану: Әгәр сез үз коллекциягезне яки функциягезне ясагыз, прококол белән чикләнгән гениралыктарны куллана аласыз.

    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>() // Тик SubtypeA, SpecificType үтәүче массив
    // var invalidArray = RestrictedArray<AnotherType>() // Компиляция хатасы, AnotherType прококолны үтәми
    
  3. Асоциативлы кыйммәтләре булган enum куллану: Әгәр подтиплар саны төгәл һәм алдан билгеле булса, 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())) // Төре буенча хата
    

Шулай итеп, турыдан-туры подтипларны чикләү стандарт массив [SomeType] эчендә мөмкин түгел. Аның урынына протоколлар, чикләнгән гениралыктар яки enumнар кулланыла, статик тиб куркынычсызлыгын тәэмин итү өчен.