Kako ograničiti podtipove u nizu u Swift-u?
sobes.tech АИ
Одговор од АИ
U Swift-u, nije moguće direktno ograničiti podtipove u nizovima sa homogenim tipom elemenata. Međutim, možete postići sličan behavior koristeći sledeće pristupe:
-
Korišćenje protokola: Definišite opšti protokol za sve dozvoljene podtipove i koristite ga kao tip elemenata niza.
protocol SpecificType {} class SubtypeA: SpecificType {} class SubtypeB: SpecificType {} class AnotherType {} var specificArray: [SpecificType] = [] // Niz koji sadrži samo tipove koji implementiraju SpecificType specificArray.append(SubtypeA()) specificArray.append(SubtypeB()) // specificArray.append(AnotherType()) // Greška pri kompilaciji, AnotherType ne odgovara protokolu -
Korišćenje generičkih sa ograničenjem putem protokola: Ako kreirate sopstvenu kolekciju ili funkciju, možete koristiti generike sa ograničenjem putem protokola.
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>() // Niz samo od SubtypeA koji implementira SpecificType // var invalidArray = RestrictedArray<AnotherType>() // Greška pri kompilaciji, AnotherType ne odgovara protokolu -
Korišćenje enumeracije (enum) sa povezanim vrednostima: Ako je broj podtipova fiksan i poznat unapred, možete koristiti 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())) // Greška tipa unutar povezane vrednosti
Takođe, direktno ograničenje podtipova u standardnom [SomeType] nizu nije moguće. Umesto toga, koriste se protokoli, generici sa ograničenjima ili enumi za obezbeđivanje statičke tipne sigurnosti.