Ako obmedziť podtypy v poli v Swift?
sobes.tech AI
Odpoveď od AI
V jazyku Swift nie je možné priamo obmedziť podtypy pre polia s homogénnym typom prvkov. Avšak, je možné dosiahnuť podobné správanie pomocou nasledujúcich prístupov:
-
Použitie protokolu: Opísať všeobecný protokol pre všetky povolené podtypy a použiť ho ako typ prvkov poľa.
protocol SpecificType {} class SubtypeA: SpecificType {} class SubtypeB: SpecificType {} class AnotherType {} var specificArray: [SpecificType] = [] // Pole obsahujúce iba typy implementujúce SpecificType specificArray.append(SubtypeA()) specificArray.append(SubtypeB()) // specificArray.append(AnotherType()) // Chyba kompilácie, AnotherType nevyhovuje protokolu -
Použitie generík s obmedzením podľa protokolu: Ak vytvárate vlastnú kolekciu alebo funkciu, môžete použiť generiká s obmedzením podľa protokolu.
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>() // Pole iba SubtypeA, implementujúcich SpecificType // var invalidArray = RestrictedArray<AnotherType>() // Chyba kompilácie, AnotherType nevyhovuje protokolu -
Použitie enum s asociovanými hodnotami: Ak je počet podtypov pevne stanovený a známy vopred, môžete použiť 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())) // Chyba typu v rámci asociovanej hodnoty
Takže, priame obmedzenie podtypov v štandardnom poli [SomeType] nie je možné. Namiesto toho sa používajú protokoly, generiká s obmedzeniami alebo enumy na zabezpečenie statickej typovej bezpečnosti.