Cum se limitează subtipurile într-un array în Swift?
sobes.tech AI
Răspuns de la AI
În Swift, nu se poate restricționa direct subtipurile în array-uri cu tipuri omogene de elemente. Cu toate acestea, se poate obține un comportament similar utilizând următoarele abordări:
-
Utilizarea de protocoale: Definiți un protocol general pentru toate subtipurile permise și folosiți-l ca tip pentru elementele array-ului.
protocol SpecificType {} class SubtypeA: SpecificType {} class SubtypeB: SpecificType {} class AnotherType {} var specificArray: [SpecificType] = [] // Array care conține doar tipuri care implementează SpecificType specificArray.append(SubtypeA()) specificArray.append(SubtypeB()) // specificArray.append(AnotherType()) // Eroare de compilare, AnotherType nu respectă protocolul -
Utilizarea de generice cu restricție prin protocol: Dacă creați o colecție sau funcție proprie, puteți folosi generice cu restricție prin protocol.
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>() // Array doar de SubtypeA care implementează SpecificType // var invalidArray = RestrictedArray<AnotherType>() // Eroare de compilare, AnotherType nu respectă protocolul -
Utilizarea enumerărilor (Enum) cu valori asociate: Dacă numărul de subtipuri este fix și cunoscut în avans, se poate folosi o enumerare.
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())) // Eroare de tip în interiorul valorii asociate
Prin urmare, restricționarea directă a subtipurilor într-un array standard [SomeType] nu este posibilă. În schimb, se utilizează protocoale, generice cu restricții sau enumerări pentru a asigura siguranța statică a tipurilor.