Middle
Jak omezit podtypy v poli ve Swiftu?
sobes.tech AI
Odpověď od AI
V jazyce Swift není možné přímo omezit podtypy v polích s homogenním typem prvků. Nicméně, lze dosáhnout podobného chování pomocí následujících přístupů:
-
Použití protokolů: Definujte obecný protokol pro všechny povolené podtypy a použijte ho jako typ prvků pole.
protocol SpecificType {} class SubtypeA: SpecificType {} class SubtypeB: SpecificType {} class AnotherType {} var specificArray: [SpecificType] = [] // Pole obsahující pouze typy implementující SpecificType specificArray.append(SubtypeA()) specificArray.append(SubtypeB()) // specificArray.append(AnotherType()) // Chyba při kompilaci, AnotherType neodpovídá protokolu -
Použití generik s omezením přes protokol: Pokud vytváříte vlastní kolekci nebo funkci, můžete použít generika s omezením přes protokol.
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 pouze s SubtypeA, které implementuje SpecificType // var invalidArray = RestrictedArray<AnotherType>() // Chyba při kompilaci, AnotherType neodpovídá protokolu -
Použití enum s asociovanými hodnotami: Pokud je počet podtypů pevně stanoven a znám předem, lze použít 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 uvnitř přiřazené hodnoty
Tímto způsobem není možné přímo omezit podtypy v běžném [SomeType] poli. Místo toho se používají protokoly, generika s omezeními nebo enumy k zajištění statické typové bezpečnosti.