Встречается на 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
интервью вопросы и ответы
