Извлекать только ключи и значения, которые я сохранил в UserDefaults

#ios #swift #nsuserdefaults #userdefaults

#iOS #swift #nsuserdefaults #пользовательские ошибки

Вопрос:

Я создал пользовательские ошибки с помощью suite,

 self.moviesWatchedUserDefaults = UserDefaults(suiteName: "com.apple.tv.2020")
  

И сохранять информацию в списке, например

 self.moviesWatchedUserDefaults.set(data, forKey: key).
  

Теперь, при извлечении, я хотел получить все ключи и значения. Для чего я использую,

 var watchedList = self.moviesWatchedUserDefaults?.dictionaryRepresentation()
  

Но возвращаемый список содержит не только элементы, которые я сохранил, но и другие ключи, такие как NSLanguages , AppleKeyboards , AppleKeyboardsExpanded , CarCapabilities и т.д.,

Как получить все ключи и значения (только те, которые я сохранил)?

Ответ №1:

Если у вас есть полный список известных ключей, вы можете отфильтровать словарь.

В следующем примере у меня есть все мои известные ключи в перечислении, и я могу фильтровать словарь, сохраняя только свои ключи:

 enum UserDefaultsKey: String, CaseIterable {
    case foo
    case bar
    case baz
}

let userDefaults = UserDefaults.standard
userDefaults.set(42, forKey: UserDefaultsKey.foo.rawValue)

let onlyMyValues = userDefaults.dictionaryRepresentation().filter { (key, _) -> Bool in
    UserDefaultsKey.allCases.map { $0.rawValue }.contains(key)
}

print(onlyMyValues) // prints ["foo": 42]
  

Комментарии:

1. Нет, это как неизвестные ключи, которые получены из серверной части.

2. В этом случае я бы предложил два варианта: 1. Отслеживайте ключи, которые вы используете для сохранения в UserDefaults, и сохраняйте их для последующего извлечения. 2. Выберите более подходящее хранилище, например, пользовательский файл plist или базу данных. CoreData может быть хорошим выбором.