ProgrammatieMiddelgrote iOS-ontwikkelaar

Leg de aanpak uit voor het organiseren en gebruiken van geneste types (nested types) in Swift. Waarom is dit nodig en welke valkuilen bestaan er bij het erven en toegang krijgen tot geneste types?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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.

Vragende valkuil.

Kan een geneste klasse of struct buiten zijn naamruimte worden geërfd? Welke syntaxis wordt gebruikt voor toegang tot geneste types?

Antwoord:

  • Geneste structuren en enums binnen een struct of enum kunnen niet buiten de naamruimte van het oudertype worden geërfd.
  • Binnen een klasse kan een geneste class alleen binnen dezelfde naamruimte worden geërfd of via het volledige pad:
class Game { class Level {} } class AdvancedLevel: Game.Level {} // toegestaan
  • Voor verwijzing is altijd een notation van de vorm ParentType.NestedType vereist.

Voorbeelden van echte fouten door gebrek aan kennis van de nuances van het onderwerp.


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.