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:
-
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 -
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 -
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.