Можно ли в Swift использовать модификатор final только с классами?

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

Ответ

Нет. Модификатор final в Swift применяется не только к классам, но и к методам, свойствам, индексам (subscripts) и даже к структурам и перечислениям (хотя для value-типов это имеет меньше смысла, так как они не поддерживают наследование). Его цель — запретить переопределение (override) или наследование.

1. Final класс: Запрещает создание подклассов.

final class Vehicle {}
// class Car: Vehicle {} // ❌ Ошибка компиляции: Inheritance from a final class

2. Final метод или свойство: Запрещает переопределение в подклассах.

class Animal {
    final func speak() { print("...") }
    final var name: String = "Animal"
}
class Dog: Animal {
    // override func speak() {} // ❌ Ошибка: Cannot override final method
    // override var name: String { "Dog" } // ❌ Ошибка
}

3. Final структура или перечисление: Хотя они не наследуются, final предотвращает их использование как протокол-ориентированный супертип в некоторых контекстах (например, let value: some Vehicle). На практике используется редко.

Преимущества использования final:

  • Безопасность: Явно указывает на дизайн, не предназначенный для наследования.
  • Производительность: Компилятор может делать агрессивные оптимизации (например, devirtualization), так как знает, что метод или класс не будут переопределены.
  • Скорость компиляции: Уменьшает время проверки типов.