როგორ შევზღუდოთ ქვესახეები Swift-ში მასივში?
sobes.tech AI
პასუხი AI-სგან
Swift телендә бертөрле элементлар тибындагы массивлар өчен турыдан-туры подтипларны чикләү мөмкин түгел. Әмма, шундый ук тәртипкә китерү өчен түбәндәге ысулларны кулланырга мөмкин:
-
Прококолны куллану: Барлык рөхсәт ителгән подтиплар өчен гомуми прококолны билгеләгез һәм аны массив элементлары тибы итеп кулланыгыз.
protocol SpecificType {} class SubtypeA: SpecificType {} class SubtypeB: SpecificType {} class AnotherType {} var specificArray: [SpecificType] = [] // SpecificType үтәүче типларны гына эченә алган массив specificArray.append(SubtypeA()) specificArray.append(SubtypeB()) // specificArray.append(AnotherType()) // Компиляция хатасы, AnotherType прококолны үтәми -
Прококол белән чикләнгән гениралыктарны куллану: Әгәр сез үз коллекциягезне яки функциягезне ясагыз, прококол белән чикләнгән гениралыктарны куллана аласыз.
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 прококолны үтәми -
Асоциативлы кыйммәтләре булган 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нар кулланыла, статик тиб куркынычсызлыгын тәэмин итү өчен.