Sobes.tech
Middle

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:

  1. 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
    
  2. 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
    
  3. 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.