Является ли open-класс в Swift final по умолчанию?

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

Ответ

Нет. Ключевое слово open и ключевое слово final в Swift являются взаимоисключающими.

  • open — это самый открытый уровень доступа для классов. Он явно разрешает:
    1. Наследование от этого класса в любом модуле.
    2. Переопределение его методов и свойств в любом модуле.
  • final — запрещает наследование от класса полностью. Его нельзя комбинировать с open.

Практическое правило: Если класс объявлен как open, он специально предназначен для наследования. Чтобы сделать open-класс неизменяемым, нужно явно пометить его как final, но тогда он перестанет быть open.

Пример:

// Этот класс МОЖНО наследовать в других модулях.
open class NetworkService {
    // Этот метод МОЖНО переопределить в других модулях.
    open func fetchData() { /* ... */ }

    // Этот метод НЕЛЬЗЯ переопределить нигде.
    public final func performRequest() { /* ... */ }
}

// Этот класс НЕЛЬЗЯ наследовать.
final class MyFinalUtility { /* ... */ }
// Ошибка компиляции: нельзя объявить 'open final' class
// open final class InvalidClass { }

Иерархия доступов для наследования (от наиболее открытого к закрытому): open > public (наследование только внутри модуля) > internal (по умолчанию) > final.