Использование 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 и хранимые свойства, которые копируют тот факт, что мутация корректно обрабатывается языком.