Sobes.tech
Middle

Hogyan korlátozhatjuk az alt típusokat egy tömbben Swiftben?

sobes.tech MI

Válasz az MI-től

Swift-ben nem lehet közvetlenül korlátozni az altípusokat homogén típusú elemekkel rendelkező tömbökben. Azonban hasonló viselkedést érhet el a következő megközelítések alkalmazásával:

  1. Protokollok használata: Határozzon meg egy általános protokollt az összes engedélyezett altípus számára, és használja azt a tömb elemtípusaként.

    protocol SpecificType {}
    
    class SubtypeA: SpecificType {}
    class SubtypeB: SpecificType {}
    class AnotherType {}
    
    var specificArray: [SpecificType] = [] // Olyan tömb, amely csak a SpecificType-et megvalósító típusokat tartalmazza
    
    specificArray.append(SubtypeA())
    specificArray.append(SubtypeB())
    // specificArray.append(AnotherType()) // Fordítási hiba, az AnotherType nem felel meg a protokollnak
    
  2. Generikusok használata protokollal való korlátozással: Ha saját kollekciót vagy függvényt hoz létre, használhat generikusokat protokollal való korlátozással.

    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>() // Csak SubtypeA típusokat tartalmazó tömb
    // var invalidArray = RestrictedArray<AnotherType>() // Fordítási hiba, az AnotherType nem felel meg a protokollnak
    
  3. Enumeráció (enum) használata társított értékekkel: Ha az altípusok száma fix és előre ismert, használhat enumot.

    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ípushiba a társított értékben
    

Így a közvetlen altípus-korlátozás a [SomeType] típusú tömbben nem lehetséges. Ehelyett protokollokat, generikusokat korlátozásokkal vagy enumokat használnak a statikus típusbiztonság biztosítására.