Ответ
Структуры в Swift являются value-типами с семантикой копирования. Отсутствие наследования — это сознательное архитектурное решение, которое следует из этого фундаментального свойства.
Основные причины:
- Целостность value-семантики: Наследование тесно связано с полиморфизмом по ссылке. Если бы структура
Bнаследовала отA, то при присваиванииBпеременной типаAпотребовалась бы «упаковка» (boxing) и работа по ссылке, что нарушило бы простую и эффективную семантику копирования. - Память и производительность: Размер структуры должен быть фиксированным и известным во время компиляции для быстрого выделения памяти на стеке. Наследование вносит неопределенность, так как размер подкласса может отличаться от размера родителя.
- Принцип композиции над наследованием: 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-семантику каждой структуры и обеспечивает необходимый уровень абстракции.