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

Константы, переменные, свойства и сабскрипт

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

Константы, переменные, свойства не могут быть более открытыми, чем их тип. Это не правильно писать свойство public для private типа. Аналогично дело обстоит и с сабскриптом: сабскрипт не может быть более открытым, чем тип индекса или возвращаемый тип.

Если константа, переменная, свойство или сабскрипт используют тип private, то они должны быть отмечены ключевым словом private:

private var privateInstance = SomePrivateClass()

Геттеры и сеттеры

Геттеры и сеттеры для констант, переменных и сабскриптов автоматически получают тот же уровень доступа как и константа, переменная, свойство или сабскрипт, которому они принадлежат.

Вы можете задать сеттер более низкого уровня доступа чем его соответствующий геттер, для ограничения области read-write этой переменной, свойства или сабскрипта. Вы присваиваете более низкий уровень доступа написав fileprivate(set), private(set) или internal(set) до вступительного var или subscript.

Заметка

Это правило применяется как к свойствам хранения так и к вычисляемым свойствам. Даже если вы не пишите явного геттера и сеттера для хранимого свойства, Swift все еще создает для вас неявный геттер и сеттер, чтобы вы могли получить доступ к хранимым свойствам. Используйте fileprivate(set), private(set) и internal(set) для изменения уровня доступа этого созданного сеттера в точно такой же форме как и в случае явного сеттера вычисляемого свойства.

Пример ниже определяет структуру TrackerdString, которая отслеживает число изменений строкового свойства:

struct TrackedString {
    private(set) var numberOfEdits = 0
    var value: String = "" {
        didSet {
            numberOfEdits += 1
        }
    }
}

Структура TrackedString определяет свойство хранения value с начальным значением "" (пустая строка). Структура так же определяет свойство хранения numberOfEdits, которое используется для отслеживания количества изменений значения value. Эта модификация отслеживания реализована в наблюдателе didSet свойства value, которое увеличивает numberOfEdits каждый раз, как value получает новое значение.

Структура TrackedString и свойство value не указывают явного уровня доступа, таким образом они оба получают дефолтный уровень доступа internal. Однако уровень доступа numberOfEdits обозначен как private(set), что означает, что это свойство может устанавливать значение только в пределах этого исходного файла, то есть в пределах структуры TrackedString. Геттер свойства все еще имеет дефолтный уровень доступа internal, но его сеттер теперь уже private к исходному файлу, где определен TrackedString. Это позволяет TrackedString изменять свойство numberOfEdits скрытно, но тем не менее позволяет свойству быть read-only (только для чтения), когда оно используется в других исходных файлах в пределах того же модуля.

Если вы создаете экземпляр TrackedString и изменяете его строковое значение несколько раз, то вы можете увидеть, что свойство numberOfEdits изменяется, чтобы соответствовать количеству фактических изменений значения:

var stringToEdit = TrackedString()
stringToEdit.value = "This string will be tracked."
stringToEdit.value += " This edit will increment numberOfEdits."
stringToEdit.value += " So will this one."
print("Количество изменений равно \(stringToEdit.numberOfEdits)")
// Выведет "Количество изменений равно 3"

Хотя вы и можете обращаться в текущему значению свойства numberOfEdits в пределах одного исходного файла, но вы не можете изменять его из другого исходных файлов. Это ограничение защищает детали реализации функциональности TrackedString, в то же время обеспечивая удобный доступ к аспекту этой функциональности.

Обратите внимание, что вы можете присвоить явный уровень доступа и к геттеру, и к сеттеру, если это необходимо. Пример ниже показывает версию структуры TrackedString, где она определена с явным указанием открытого уровня доступа. Таким образом, элементы структуры (включая свойство numbersOfEdits) получают уровень доступа internal по умолчанию. Вы можете сделать уровень доступа геттера параметра numberOfEdits открытым, а сеттера этого же свойства сделать частным, таким образом вы комбинируете и public, и private(set) модификаторы уровней доступа:

public struct TrackedString {
    public private(set) var numberOfEdits = 0
    public var value: String = "" {
        didSet {
            numberOfEdits += 1
        }
    }
    public init() {}
}

 

Swift: 
4.0