Видеокурсы по изучению языка программирования Swift. Подробнее

Расширения и уровни доступа

Если вы нашли опечатку в тексте, выделите ее и нажмите CTRL + ENTER.

Вы можете расширить класс, структуру или перечисление в любом контексте, в котором класс, структура или перечисление доступны. Любой элемент типа, добавленный в расширение, имеет тот же дефолтный уровень доступа, что и типы, объявленные в исходном типе, будучи расширенными. Например, если вы расширяете тип public, то любые новые элементы этого типа, которые вы добавили, будут иметь уровень доступа равный internal. Если вы расширяете fileprivate тип, то дефолтный уровень доступа любого добавленного в него члена будет fileprivate. Если вы расширяете private тип, то дефолтный уровень доступа любого добавленного в него члена будет private.

Аналогично вы можете отметить расширение, явно указав модификатор уровня доступа (например, private extension), для того чтобы указать новый дефолтный уровень доступа, который будут иметь элементы, определенные в этом расширении. Этот новый уровень доступа может быть переопределен для отдельных элементов расширением.

Вы не можете предоставлять явный модификатор уровня доступа для расширения, если вы используете расширение для добавления соответствия протоколу. Вместо этого, собственный уровень доступа протокола используется для предоставления дефолтного уровня доступа для каждой реализации требования протокола внутри расширения.

Private свойства и методы в расширениях

Расширения, которые находятся в том же файле, что и сам класс/структура/перечисление, который(ую/ое) они расширяют, ведут себя точно так, как будто они являются частью расширяемого типа. И в результате вы можете: 

  • Объявлять приватные члены в оригинальном объявлении и получать доступ к ним через расширение
  • Объявлять приватные члены в одном расширении и получать доступ к ним через другие расширения, если они находятся в том же файле
  • Объявлять приватные члены в расширении и получать доступ к ним в оригинальном объявлении

Это поведение означает, что в можете использовать расширения для организации вашего кода, независимо от того, имеют ли ваши типы приватные члены или нет. Например, дан нам вот такой простой протокол:

protocol SomeProtocol {
    func doSomething()
}

Вы можете использовать расширение, чтобы реализовать требование протокола:

struct SomeStruct {
    private var privateVariable = 12
}
 
extension SomeStruct: SomeProtocol {
    func doSomething() {
        print(privateVariable)
    }
}

 

Swift: 
4.0