Kaip apriboti pogrupių tipus Swift masyve?
sobes.tech AI
Atsakymas iš AI
Swift kalboje nėra tiesioginio galimų potipų apribojimo masyvuose su homogeniškais elementų tipais. Tačiau, galima pasiekti panašų elgesį naudojant šiuos požiūrius:
-
Protokolo naudojimas: Aprašyti bendrą protokolą visiems leidžiamiems potipiams ir naudoti jį kaip masyvo elementų tipą.
protocol SpecificType {} class SubtypeA: SpecificType {} class SubtypeB: SpecificType {} class AnotherType {} var specificArray: [SpecificType] = [] // Masyvas, kuriame yra tik tipai, įgyvendinantys SpecificType specificArray.append(SubtypeA()) specificArray.append(SubtypeB()) // specificArray.append(AnotherType()) // Klaidų kompiliuojant, AnotherType neatitinka protokolo -
Genių naudojimas su protokolo apribojimu: Jei kuriate savo kolekciją ar funkciją, galite naudoti genikus su protokolo apribojimu.
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>() // Masyvas tik SubtypeA, įgyvendinančių SpecificType // var invalidArray = RestrictedArray<AnotherType>() // Klaidų kompiliuojant, AnotherType neatitinka protokolo -
Enum naudojimas su asocijuotomis reikšmėmis: Jei potipų skaičius yra fiksuotas ir žinomas iš anksto, galima naudoti 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())) // Klaida tipo viduje asocijuotos reikšmės
Taigi, tiesioginis potipų apribojimas standartiniame masyve [SomeType] nėra įmanomas. Vietoj to, naudojami protokolai, genikai su apribojimais arba enumai, siekiant užtikrinti statinę tipų saugumą.