Я пытаюсь перебрать массив таймеров, чтобы установить каждый таймер равным нулю. Я встречаюсь с этой ошибкой:
Невозможно присвоить значение: «таймер» является константой «let»
Когда я использую следующий код:
var timers = [Timer?]()
func clearTimers() {
for timer in timers {
timer!.invalidate()
timer = nil
}
}
Перебирайте indices
, а не таймеры.
Почему вы хотите установить таймеры на ноль? аннулирования таймера достаточно. Также измените timer!.invalidate() на timer?.invalidate()
Хранение массива опций не имеет особого смысла, поэтому начните с простого объявления массива timers
как:
var timers = [Timer]()
Затем вы можете перебрать таймеры, чтобы сделать их недействительными, и удалить все ссылки из массива, чтобы освободить их:
func clearTimers() {
for timer in timers {
timer.invalidate()
}
timers.removeAll(keepingCapacity:false)
}
Проблема в том, что for timer in timers
дает вам новую ссылку — вы не смотрите на фактический необязательный таймер на его месте в массиве. Вместо этого выполните итерацию по самому массиву (через его indices
):
func clearTimers() {
for ix in timers.indices {
timers[ix]?.invalidate()
timers[ix] = nil
}
}
Назначение
nil
локальной переменнойtimer
не сделает того, что вы хотите, даже если бы вы могли. Вам нужно удалить таймер из массива. Просто вызовитеtimers.removeAll(keepingCapacity:false)
(илиtrue
, если вы планируете добавлять новые таймеры обратно в массив)