Поддерживает ли Swift множественное наследование классов?

«Поддерживает ли Swift множественное наследование классов?» — вопрос из категории ООП, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет. Классы в Swift не поддерживают множественное наследование (от нескольких базовых классов). Это сознательное дизайнерское решение для избежания сложностей, таких как проблема ромбовидного наследования (diamond problem).

Альтернативы и лучшие практики в Swift:

  1. Протоколы (Protocols): Класс или структура могут соответствовать множеству протоколов.

    protocol Flyable { func fly() }
    protocol Swimmable { func swim() }
    
    class Duck: Flyable, Swimmable {
        func fly() { print("Flying") }
        func swim() { print("Swimming") }
    }
  2. Композиция (Composition): Включение функциональности через свойства, а не наследование.

    class Engine { func start() { ... } }
    class Radio { func play() { ... } }
    
    class Car {
        private let engine = Engine() // Композиция
        private let radio = Radio()   // Композиция
        func drive() {
            engine.start()
            radio.play()
        }
    }

Почему протоколы и композиция лучше?

  • Гибкость: Не привязывают к конкретной иерархии классов.
  • Безопасность: Избегают неоднозначностей.
  • Тестируемость: Легче подменять зависимости (Dependency Injection).

Swift поощряет использование протоколов и композиции через протокольно-ориентированное программирование (POP).