removeVolatile не очищает все значения в UserDefaults.registrationDomain - PullRequest
1 голос
/ 15 марта 2020

Сегодня я узнаю, что iOS имеет энергозависимое и постоянное хранилище для UserDefaults.

. Я регистрирую значение (value) с ключом (key), используя метод register .

let key = "key"
let value = "value"
UserDefaults.standard.register(defaults: [key: value])

В своем коде приложения я пытаюсь удалить ключ, используя removeObject(forKey:) method.

UserDefaults.standard.removeObject(forKey: key)

Я ожидаю, что в следующий раз, когда я попытаюсь получить значение key, object(forKey:) вернет nil (но это не так).

Полный код:

let key = "key"
let value = "value"

UserDefaults.standard.register(defaults: [key: value])
UserDefaults.standard.setValue(value, forKey: key)
UserDefaults.standard.removeObject(forKey: key)
UserDefaults.standard.object(forKey: key) // "value" - why?
  1. Насколько я понимаю, register метод «регистрирует» значения в registrationDomain , который является временным, пока не будет установлено действительное значение (с использованием метода setValue(forKey:)). Но в этом случае, даже если я установил реальное значение, а затем удалил значение, object(forKey:) возвращает значение из registrationDomain. Почему Apple решила сделать это таким образом? Я не могу придумать очевидного, почему, когда однажды явно запрашивает удаление значения, оно все равно должно возвращать значение, зарегистрированное с использованием метода register? Это просто вопрос постоянных или нестабильных доменов?
  2. Означает ли это, что после регистрации ключа с использованием метода register всегда ожидается, что он будет иметь значение?

Почему я не могу использовать removeVolatileDomain(forName:) для очистки всего registrationDomain?

let key = "key"
let value = "value"

UserDefaults.standard.register(defaults: [key: value])

// This doesn't work? registrationDomain = ["key": "value"]
UserDefaults.standard.removeVolatileDomain(forName: UserDefaults.registrationDomain)


// Why do I have to do this?
var registeredDefaults = UserDefaults.standard.volatileDomain(forName: UserDefaults.registrationDomain)
registeredDefaults[key] = nil
UserDefaults.standard.setVolatileDomain(registeredDefaults, forName: UserDefaults.registrationDomain)
// registrationDomain = [:]
...