Почему структуры (struct) в Swift не поддерживают наследование?

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

Ответ

Структуры в Swift являются value-типами с семантикой копирования. Отсутствие наследования — это сознательное архитектурное решение, которое следует из этого фундаментального свойства.

Основные причины:

  1. Целостность value-семантики: Наследование тесно связано с полиморфизмом по ссылке. Если бы структура B наследовала от A, то при присваивании B переменной типа A потребовалась бы «упаковка» (boxing) и работа по ссылке, что нарушило бы простую и эффективную семантику копирования.
  2. Память и производительность: Размер структуры должен быть фиксированным и известным во время компиляции для быстрого выделения памяти на стеке. Наследование вносит неопределенность, так как размер подкласса может отличаться от размера родителя.
  3. Принцип композиции над наследованием: Swift поощряет использование протоколов и композиции для повторного использования кода, что является более гибкой и безопасной альтернативой классическому наследованию.

Как добиться полиморфизма для структур? Используйте протоколы.

protocol Renderable {
    func draw()
}

struct Circle: Renderable {
    var radius: Double
    func draw() { print("Drawing circle with radius: (radius)") }
}

struct Square: Renderable {
    var side: Double
    func draw() { print("Drawing square with side: (side)") }
}

let shapes: [Renderable] = [Circle(radius: 5), Square(side: 10)]
shapes.forEach { $0.draw() }
// Output:
// Drawing circle with radius: 5.0
// Drawing square with side: 10.0

Этот подход сохраняет value-семантику каждой структуры и обеспечивает необходимый уровень абстракции.