Я работаю над небольшим приложением для iPhone, и я использую в NSUserDefaults
качестве сохранности данных. Нужно только следить за несколькими вещами, такими как некоторые имена и цифры, поэтому я полагаю, что я мог бы также сделать это простым.
Я нашел эту страницу для справки, но я не думаю, что она может ответить на мой вопрос. По сути, я хочу иметь возможность проверить, существует ли уже значение (или ключ) в NSUserDefaults
и затем сделать что-то соответственно.
Некоторые примеры: Приложение запускается, если оно запускается впервые, выдает предупреждение «Добро пожаловать». Чтобы узнать, открылся ли он впервые, он читает UserDefaults
и проверяет.
Пример 2: «Hello [Name]», где Name - это то, что вы ввели. Если вы открыли приложение, а имя отсутствует, оно должно сказать «Hello World». Мне нужно проверить, если вы уже ввели имя и действовать соответственно. Имя будет храниться в NSUserDefaults
.
Некоторая помощь здесь? Я действительно ценю это!
источник
– dictionaryRepresentation
и проверить ключ.Как упомянуто выше, это не будет работать для примитивных типов, где 0 / NO может быть допустимым значением. Я использую этот код.
источник
BOOL
. Он будет точно различатьNO
и не устанавливать, в отличие отobjectForKey:
.objectForKey:
будет возвращенnil
независимо от намерения программиста в конечном итоге сохранитьBool
или любой другой тип данных. Когда присутствует примитив,objectForKey:
он не возвращается,nil
даже если ключ связан со значением примитива.objectForKey:
Метод возвращает ,nil
если значение не существует. Вот простой тест IF / THEN, который скажет вам, является ли значение ноль:источник
« objectForKey вернет nil, если он не существует. » Он также вернет nil, если он существует, и это либо целое число, либо логическое значение со значением ноль (т. е. FALSE или NO для логического значения).
Я проверил это в симуляторе для 5.1 и 6.1. Это означает, что вы не можете действительно проверить, были ли установлены целые или логические значения, запрашивая «объект». Вы можете избежать неприятностей с целыми числами, если не возражаете относиться к «не установлен», как если бы он был «установлен на ноль».
Люди, которые уже проверяли это, похоже, были одурачены ложным отрицательным аспектом, то есть проверяли это, проверяя, возвращает ли objectForKey ноль, когда вы знаете, что ключ не был установлен, но не замечая, что он также возвращает ноль, если ключ был установлен, но был установлен на НЕТ.
Для моей собственной проблемы, которая привела меня сюда, я просто изменил семантику моего логического значения так, чтобы желаемое значение по умолчанию соответствовало значению NO. Если это не вариант, вам нужно хранить как что-то отличное от логического значения и убедиться, что вы можете определить разницу между ДА, НЕТ и «не установлено».
источник
@0
вместо0
,@NO
вместоNO
или просто@(variable)
. Читайте о них здесь.Свифт 3/4:
Вот простое расширение для типов ключей-значений Int / Double / Float / Bool, которые имитируют поведение Optional-return других типов, доступных через UserDefaults.
( Изменить 30 августа 2018 года: обновлен более эффективный синтаксис по предложению Лео.)
Теперь они более согласованы с другими встроенными методами get (строка, данные и т. Д.). Просто используйте методы get вместо старых.
источник
return self.object(forKey: key) as? Int
, чтобы искать значение только один раз.Я только что прошел через это, и все ваши ответы помогли мне найти хорошее решение для меня. Я отказался идти по предложенному пути, просто потому, что мне было трудно читать и понимать.
Вот что я сделал. У меня была BOOL, которая переносилась в переменной с именем _talkative.
Когда я устанавливаю свой объект по умолчанию (NSUserDefaults), я устанавливаю его как объект, поскольку затем я могу проверить, был ли он нулевым:
Затем, когда я пошел посмотреть, существует ли он, я использовал:
Затем я использовал объект как BOOL:
Кажется, это работает в моем случае. Это просто придало мне больше визуального смысла.
источник
Попробуй эту маленькую крошку:
Относитесь ко всему как к объекту. Кажется, работает на меня.
источник
Быстрая версия, чтобы получить
Bool?
источник
boolForKey
?NSUserDefaults.standardUserDefaults().boolForKey(DefaultsIsGiver)
boolForKey
вернетсяBool
и неBool?
так , если ключ не там вы получите ,false
а неnil
Продлите
UserDefaults
один раз, чтобы не копировать и не вставлять это решение:источник
В Swift3 я использовал таким образом
Ответ велик , если вы хотите использовать , что несколько раз.
Я надеюсь, что это помогает :)
источник
Swift 3.0
источник