Geneste types (nested types) maken het mogelijk om nieuwe structuren, klassen en enumeraties binnen bestaande types — klassen, structuren of enums — te declareren. Dit zorgt voor een betere structurering van de code, verbergt implementatiedetails en geeft duidelijk aan dat een type alleen aan zijn ouder behoort.
Voorbeeld:
struct Chessboard { enum PieceType { case king, queen, rook, bishop, knight, pawn } struct Square { let file: Character let rank: Int } } let kingType = Chessboard.PieceType.king let square = Chessboard.Square(file: "E", rank: 4)
Geneste types zijn niet rechtstreeks toegankelijk buiten hun naamruimte, wat het risico op verkeerd gebruik vermindert en de code beter leesbaar maakt.
Kan een geneste klasse of struct buiten zijn naamruimte worden geërfd? Welke syntaxis wordt gebruikt voor toegang tot geneste types?
Antwoord:
class Game { class Level {} } class AdvancedLevel: Game.Level {} // toegestaan
ParentType.NestedType vereist.Verhaal
Bij het herontwerpen van de businesslogica van het project waren de types te diep genest: een structuur in een enum in een struct. Dit leidde tot een lange syntaxis voor toegang tot de interne types, die verwarring veroorzaakte bij nieuwe teamleden en unit-tests bemoeilijkte.
Verhaal
Een programmeur verklaarde een geneste enum voor staten in een klasse, maar probeerde deze te gebruiken zonder naamkwalificatie buiten de klasse. Dit resulteerde in een compilatiefout en vereiste correcties van verwijzingen in het hele project.
Verhaal
In het kader van het schalen van het project heeft een andere ontwikkelaar geprobeerd een klasse te erven van een interne geneste klasse (nested class), maar stuitte op toegangsfouten voor privé-eigenschappen, omdat het toegangssysteem voor interne leden niet buiten de oudernaamruimte kan worden uitgebreid.