ProgrammierungMiddle iOS Entwickler

Erklären Sie den Ansatz zur Organisation und Nutzung von eingebetteten Typen (nested types) in Swift. Warum ist das notwendig und welche Fallstricke gibt es bei der Vererbung und dem Zugriff auf eingebettete Typen?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

Eingebettete Typen (nested types) ermöglichen es, neue Strukturen, Klassen und Enumerationen innerhalb bestehender Typen - Klassen, Strukturen oder Enum - zu deklarieren. Dies ermöglicht eine bessere Strukturierung des Codes, verbirgt Implementierungsdetails und macht explizit, dass der Typ nur zu seinem Elternteil gehört.

Beispiel:

struct Schachbrett { enum FigurenTyp { case könig, dame, turm, läufer, springer, bauern } struct Feld { let datei: Charakter let rang: Int } } let königTyp = Schachbrett.FigurenTyp.könig let feld = Schachbrett.Feld(datei: "E", rang: 4)

Eingebettete Typen sind außerhalb ihres Namensraums nicht direkt zugänglich, was das Risiko eines falschen Gebrauchs verringert und den Code lesbarer macht.

Fangfrage.

Kann man eine eingebettete Klasse oder Struktur außerhalb ihres Namensraums vererben? Welches Syntax wird verwendet, um auf eingebettete Typen zuzugreifen?

Antwort:

  • Eingebettete Strukturen und Enum innerhalb einer Struktur oder Enum können nicht außerhalb des Elterntyps vererbt werden.
  • Innerhalb einer Klasse kann eine eingebettete Klasse nur innerhalb desselben Namensraums oder über den vollständigen Pfad vererbt werden:
class Spiel { class Ebene {} } class ErweiterteEbene: Spiel.Ebene {} // erlaubt
  • Für Verweise ist immer die Schreibweise ParentType.NestedType erforderlich.

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas.


Geschichte

Bei der Neugestaltung der Geschäftslogik des Projekts wurden Typen zu tief eingebettet: eine Struktur in einem Enum in einer Struktur. Dies führte zu einer langen Syntax beim Zugriff auf interne Typen, die neue Teammitglieder verwirrte und Unit-Tests erschwerte.


Geschichte

Ein Programmierer erklärte ein eingebettetes Enum für Zustände in einer Klasse, versuchte aber, es ohne Namensqualifikation außerhalb der Klasse zu verwenden. Dies führte zu einem Kompilierungsfehler und erforderte das Korrigieren der Verweise im gesamten Projekt.


Geschichte

Im Rahmen der Skalierung des Projekts versuchte ein anderer Entwickler, eine Klasse aus einer eingebetteten Klasse (nested class) zu vererben, stieß jedoch auf Zugriffsfehler auf private Eigenschaften, da der Zugriff auf interne Mitglieder nicht außerhalb des Elternnamensraums erweitert werden kann.