Ответ
Да, это прямое нарушение LSP.
Принцип Лисков гласит, что объекты должны быть заменяемыми экземплярами своих базовых классов без изменения корректности программы.
UINavigationController не спроектирован для использования в качестве viewController внутри стека другого UINavigationController. Такая вложенность приводит к:
- Непредсказуемому поведению навигационной панели (появлению двух панелей, конфликтам кнопок
back). - Проблемам с жестами (например,
interactivePopGestureRecognizer). - Нарушению ожидаемого жизненного цикла и контейнерной иерархии UIKit.
Неправильный подход (нарушает LSP):
let innerNavController = UINavigationController(rootViewController: SomeViewController())
let outerNavController = UINavigationController(rootViewController: innerNavController) // Нарушение!
window?.rootViewController = outerNavController
Правильные альтернативы:
- Использовать
UINavigationControllerкак корневой контейнер, а внутри стека размещать толькоUIViewController. - Для сложной навигации использовать комбинацию
UITabBarControllerиUINavigationController. - Реализовать кастомный контейнерный контроллер, если требуется особая логика переходов.