Использование didSet и private (набор) в Swift Array

Я работаю над быстрым проектом, и у меня есть несколько массивов. В одном из моих массивов я не хочу, чтобы клиент мог мутировать его, не используя один из моих специально определенных методов. С другой стороны, я хочу, чтобы геттер был доступен. Мои вопросы касаются свойств добавления и настройки.

Вопрос 1: закрывает ли (задает) клиентов из вызова array.append?

В другом массиве я хочу увидеть, было ли оно изменено.

Вопрос 2: Если я дам массиву свойство didSet, то он вызывается, когда массив добавляется к?

Ответы

Ответ 1

Вопрос 1: Предоставляет ли private (set) клиентам останавливать вызов array.append?

Да, да.

Вопрос 2: Если я использую, дайте массиву свойство didSet, то он вызывается, когда массив добавляется к?

Да, didSet вызывается, когда на него вызывается append().

Ответ 2

Ответы на ваши вопросы легко понять, когда вы понимаете, что массивы в Swift эффективно передаются по значению. Я говорю эффективно, потому что они ведут себя так, как будто их копируют, когда они передаются, но под капотом есть какая-то умная магия, чтобы оптимизировать вещи и избежать ненужного дублирования элементов.

Обработчик didSet вызывается, когда изменяется значение свойства, которое в Swift включает массивы. Таким образом, append() для массива в Swift фактически аналогично += для целого числа: сначала массив считывается, затем создается новый массив с добавленным значением, а затем этот новый массив записывается обратно в свойство, Таким образом, вы можете увидеть, что он обязательно вызовет didSet, если вы вызовете append() в свойстве массива, и аналогичным образом, сделав set private, внешние пользователи не смогут вызвать append(), поскольку они не будут способный записать новое значение обратно в массив.

Ответ 3

  • Вопрос 1 Да, поскольку вызовы с изменением функции изменяют сохраненное значение, поэтому private (set) запрещает вызовы к мутирующим функциям.
  • Вопрос 2 Да, по той же причине наблюдатели запускаются.

Здесь нет ничего конкретного в массивах, это связано с тем, что массивы являются structs и append являются мутирующим элементом. Вызов append очень похож на влияние на новое значение свойства. Это не супер явно, но в документе больше информации для mutating members и хранимые свойства, которые копируют тот факт, что мутация корректно обрабатывается языком.