Какие уровни доступа существуют в Swift?

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

Ответ

Swift предоставляет пять уровней доступа, от наиболее открытого к наиболее ограниченному:

1. open - Наиболее открытый доступ

open class NetworkManager {
    open func fetchData() { /* ... */ }
}
// Можно: наследовать, переопределять, использовать из других модулей

2. public - Открытый доступ

public struct APIResponse {
    public var data: Data
    internal var metadata: Metadata // Недоступно извне
}
// Можно: использовать из других модулей
// Нельзя: наследовать/переопределять классы из других модулей

3. internal - Доступ по умолчанию

internal class DataProcessor {
    func process() { /* ... */ } // По умолчанию internal
}
// Доступно только внутри модуля (framework или app)

4. fileprivate - Доступ в пределах файла

fileprivate class FileHelper {
    static func readFile() { /* ... */ }
}
// Доступно только в этом .swift файле

5. private - Наиболее ограниченный доступ

class BankAccount {
    private var balance: Decimal = 0

    private func calculateInterest() { /* ... */ }
}
// Доступно только в пределах объявляющей области (класса, структуры)

Ключевые правила:

  • Уровень доступа сущности не может быть более открытым, чем уровень доступа её типа
  • open применим только к классам и членам классов
  • private(set) позволяет публичное чтение, но приватную запись:
    public struct User {
    public private(set) var id: UUID // Чтение публично, запись приватно
    }

Области видимости в порядке убывания: open > public > internal > fileprivate > private