В Swift 4, как мне удалить блочный наблюдатель KVO?

Если я храню наблюдателя следующим образом:

let observer: NSKeyValueObservation = foo.observe(\.value, options: [.new]) { (foo, change) in
    print(change.newValue)
}

Как удалить/отключить/очистить observer после того, как он больше не понадобится?

У моего экземпляра foo нет метода remove -like, который получает экземпляр NSKeyValueObservation, сам observer не имеет никакого remove -подобного.

Ответ 1

В iOS 11 вам не обязательно. Просто позвольте наблюдателю выйти из сферы действия. Нет никакого штрафа для того, чтобы позволить наблюдателю умереть перед наблюдаемым или за то, что наблюдаемый умирает перед наблюдателем, поэтому у вас нет реальной работы.

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

(Вы говорите: "Если я храню наблюдателя подобным образом", но способ хранения его с помощью let является несколько глупым способом хранения наблюдателя. Лучше было бы поместить его в набор из которую вы можете удалить позже или, по крайней мере, сохранить в необязательном var, который позже можно установить в nil.)