Kuidas piirata alamliike Swiftis massiivis?
sobes.tech AI
Vastus AI-lt
Swiftis ei ole võimalik otse piirata alamliike homogeensete elementide massiivides. Kuid, sarnase käitumise saavutamiseks saab kasutada järgmisi lähenemisviise:
-
Protokolli kasutamine: Kirjeldada üldine protokoll kõigile lubatud alamliikidele ja kasutada seda massiivi elementide tüübina.
protocol SpecificType {} class SubtypeA: SpecificType {} class SubtypeB: SpecificType {} class AnotherType {} var specificArray: [SpecificType] = [] // Massiiv, mis sisaldab ainult SpecificType'i realiseerivaid tüüpe specificArray.append(SubtypeA()) specificArray.append(SubtypeB()) // specificArray.append(AnotherType()) // Kompileerimisel viga, AnotherType ei vasta protokollile -
Genereikide kasutamine piiranguga protokolli järgi: Kui loote oma kogumi või funktsiooni, saate kasutada genereikuid piiranguga protokolli järgi.
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>() // Massiiv ainult SubtypeA, mis realiseerib SpecificType // var invalidArray = RestrictedArray<AnotherType>() // Kompileerimisel viga, AnotherType ei vasta protokollile -
Enum kasutamine koos seotud väärtustega: Kui alamliikide arv on fikseeritud ja teada ette, saab kasutada 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())) // Tüübiviga seotud väärtuses
Seega, otse alamliikide piiramine standardmassiivis [SomeType] ei ole võimalik. Selle asemel kasutatakse protokolle, genereikuid piirangutega või enum'e, et tagada staatiline tübiturvalisus.