Опция NSKeyValueObservingOptions.initial в блочном KVO - PullRequest
0 голосов
/ 09 апреля 2020

В документации сказано [когда используется .initial]: Словарь изменений в уведомлении всегда будет содержать запись newKey, если также указана новая, но никогда не будет содержать запись oldKey.

В блочном KVO наблюдатель получает change struct, где используется oldValue.

oldValue имеет дикий тип Optional<Optional<Any>>.

Любые формы прямого сравнения (с nil, .some (nil) et c) не удалось из-за ошибки «Any is not Comparable».

Как я могу проверить, что вызов наблюдателя является начальным?

ОБНОВЛЕНИЕ

Хорошо.

Я наблюдаю value: Any от некоторых attribute. Действительно, value построен из двоичных данных внутри attribute и имеет тип, в котором он был доставлен, реальный тип - Bool? в этом случае. Наблюдатель уволен правильно, это не проблема.

observe(\ViewController.attribute.value, options: [.initial, .new, .old]) { (_self, change) in
    guard change.newValue as? Bool != change.oldValue as? Bool // does not work in initial
    else { 
        return 
    }
    ...
}

В начальном случае у меня есть

(lldb) po change
▿ NSKeyValueObservedChange<Optional<Any>>
  - kind : __C.NSKeyValueChange
  ▿ newValue : Optional<Optional<Any>>
    ▿ some : Optional<Any>
      - some : <null>
  ▿ oldValue : Optional<Optional<Any>>
    - some : nil
  - indexes : nil
  - isPrior : false

Новое значение nil (attribute.value == .none). Старое значение, в соответствии с документацией, не должно содержаться. Что я должен сделать, чтобы убедиться, что он действительно не содержится?

1 Ответ

0 голосов
/ 10 апреля 2020

Кажется, я нашел:

guard
    case let oldValue? = change.oldValue, oldValue == nil ||
    (change.newValue as? Bool != oldValue as? Bool)
else
{
    return
}
...