Встречается на 36% собеседований по Mobile

В чём разница между open и public

В Swift модификаторы доступа open и public оба позволяют использовать типы и их члены из других модулей, но ключевое различие — в возможности наследования и переопределения: open разрешает подклассы и переопределение методов вне модуля, а public — только использование, без наследования и переопределения.

Как это работает

Модификаторы доступа в Swift определяют, на каком уровне видимости находится код: внутри модуля, в другом файле, или в другом модуле. open и public — самые открытые уровни, но open добавляет дополнительную гибкость для фреймворков и библиотек.

  • open — самый высокий уровень доступа. Класс, объявленный как open, можно использовать и наследовать в других модулях. Его методы и свойства, помеченные как open, можно переопределять.
  • public — позволяет использовать класс и его члены из других модулей, но запрещает наследование и переопределение. Это ограничение действует только для других модулей; внутри того же модуля наследование и переопределение разрешены.

Пример

swift
// Модуль A (библиотека)
open class OpenClass {
    open func openMethod() { }
    public func publicMethod() { }
}

public class PublicClass {
    public func method() { }
}

// Модуль B (приложение)
class SubclassOfOpen: OpenClass { // OK: open разрешает наследование
    override func openMethod() { } // OK: open метод можно переопределить
    // override func publicMethod() { } // Ошибка: public метод нельзя переопределить
}

// class SubclassOfPublic: PublicClass { } // Ошибка: public класс нельзя наследовать

Подводные камни

  • open применим только к классам и их членам. Для структур, перечислений и протоколов используется public, так как они не поддерживают наследование в классическом смысле.
  • Если класс public, но его метод объявлен как open, то метод можно переопределять, а сам класс — нет. Это часто путают.
  • Внутри одного модуля разница между open и public не проявляется: наследование и переопределение разрешены для обоих. Ограничение public действует только при импорте модуля.
  • При создании фреймворка для сторонних разработчиков стоит использовать open только для тех классов, которые предполагается расширять, иначе это может привести к нежелательному переопределению.

Когда использовать

  • open — для классов, которые предназначены для наследования и кастомизации в клиентском коде. Например, базовые классы в UI-библиотеках, которые разработчики должны расширять.
  • public — для стабильного API, которое не должно изменяться через наследование. Например, утилитарные классы, фабрики, сервисы.

Коротко

  • open разрешает наследование и переопределение вне модуля, public — нет.
  • open применяется только к классам и их членам.
  • Внутри модуля разницы нет, ограничение public действует только для внешних модулей.
  • Выбирайте open для расширяемых API, public — для закрытых от изменений.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы