Использование 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 Да, поскольку вызовы мутирующих функций изменяют сохраненное значение, поэтому private(set) запрещает вызовы мутирующих функций.
- Вопрос 2 Да, по той же причине, наблюдатели вызваны.
Здесь нет ничего конкретного для массивов, это является следствием того, что массивы являются структурами и append
будучи мутирующим членом. призвание append
очень похоже на влияние на новое значение свойства. Это не является супер-явным, но в документе есть больше информации для мутирующих членов и сохраненных свойств, которые подтверждают тот факт, что мутирование правильно обрабатывается языком.