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

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

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

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

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

3 ответа

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

Да, это так.

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

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

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

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

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

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

Другие вопросы по тегам