Вложенные типы (nested types) позволяют объявлять новые структуры, классы и перечисления внутри существующих типов — классов, структур или enum. Это позволяет лучше структурировать код, скрыть детали реализации и явно указать, что тип относится только к своему родителю.
Пример:
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)
Вложенные типы недоступны напрямую вне их пространства имён, что снижает риск неправильного использования и делает код более читабельным.
Можно ли наследовать вложенный класс или struct вне его пространства имён? Какой синтаксис используется для обращения к вложенным типам?
Ответ:
class Game { class Level {} } class AdvancedLevel: Game.Level {} // допустимо
ParentType.NestedType.История
В перепроектировании бизнес-логики проекта типы вложили слишком глубоко: структура в enum в struct. Получился длинный синтаксис обращения к внутренним типам, который сбивал с толку новых участников команды и затруднял юнит-тесты.
История
Программист объявил вложенный enum для состояний в классе, но попытался использовать его без квалификации имени вне класса. Это вызвало компиляционную ошибку и потребовало исправлять обращения по всему проекту.
История
В рамках масштабирования проекта другой разработчик попытался унаследовать класс из внутреннего вложенного класса (nested class), но столкнулся с ошибками доступа к приватным свойствам, потому что механизм доступа к внутренним членам нельзя расширять вне родительского пространства.