Typy zagnieżdżone (nested types) pozwalają na deklarowanie nowych struktur, klas i enumeracji wewnątrz istniejących typów — klas, struktur lub enum. Umożliwia to lepszą organizację kodu, ukrycie szczegółów implementacji i wyraźne wskazanie, że typ odnosi się tylko do swojego rodzica.
Przykład:
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)
Typy zagnieżdżone nie są bezpośrednio dostępne poza ich przestrzenią nazw, co zmniejsza ryzyko niewłaściwego użycia i sprawia, że kod jest bardziej czytelny.
Czy można dziedziczyć zagnieżdżoną klasę lub strukturę poza jej przestrzenią nazw? Jaka składnia jest używana do odniesienia się do typów zagnieżdżonych?
Odpowiedź:
class Game { class Level {} } class AdvancedLevel: Game.Level {} // dozwolone
ParentType.NestedType.Historia
W przeprojektowaniu logiki biznesowej projektu typy były zagnieżdżone zbyt głęboko: struktura w enum w struct. Powstała długa składnia odniesienia do wewnętrznych typów, która myliła nowych członków zespołu i utrudniała testy jednostkowe.
Historia
Programista zadeklarował zagnieżdżony enum dla stanów w klasie, ale próbował użyć go bez kwalifikacji nazwy poza klasą. Spowodowało to błąd kompilacji i wymagało poprawiania odniesień w całym projekcie.
Historia
W ramach skalowania projektu inny programista próbował dziedziczyć klasę z wewnętrznej zagnieżdżonej klasy (nested class), ale napotkał błędy dostępu do prywatnych właściwości, ponieważ mechanizm dostępu do członków wewnętrznych nie może być rozszerzany poza przestrzeń rodzica.