Каков уровень доступа у класса, объявленного с ключевым словом `open` в Swift?

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

Ответ

Класс, объявленный с модификатором open, имеет наивысший уровень доступа в Swift.

open означает:

  1. Доступность: Класс и его члены (методы, свойства) доступны для использования и наследования из любого другого модуля (target).
  2. Переопределение: Члены класса могут быть переопределены (overridden) в подклассах, находящихся в других модулях.

Сравнение с public:

  • public класс также доступен из других модулей, но от него нельзя наследоваться вне его родного модуля. Его члены можно только использовать.
  • open снимает это ограничение, позволяя и использовать, и наследоваться.

Пример:

// В модуле 'FrameworkA'
open class OpenVehicle {
    open func startEngine() { print("Vroom!") }
    public func honk() { print("Beep!") }
}

// В модуле 'App' (импортирует FrameworkA)
class Car: OpenVehicle { // Наследование ВОЗМОЖНО, т.к. класс `open`
    override func startEngine() { // Переопределение ВОЗМОЖНО
        super.startEngine()
        print("Check electric motor.")
    }
    // override func honk() { } // ОШИБКА: `honk` не `open`, только `public`
}

Модификатор open предназначен в первую очередь для разработки фреймворков, где нужно предоставлять расширяемый API.