Проверить, существует ли UserDefault - Swift

87

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

func userAlreadyExist() -> Bool {
    var userDefaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()

    if userDefaults.objectForKey(kUSERID) {
        return true
    }

    return false
}

Однако не важно, что он всегда будет возвращать истину, даже если объект еще не существует? Это правильный способ проверки существования?

Райан
источник

Ответы:

128

У Астуна есть отличный ответ. См. Ниже версию Swift 3.

func isKeyPresentInUserDefaults(key: String) -> Bool {
    return UserDefaults.standard.object(forKey: key) != nil
}
user7248923
источник
29

Я скопировал / вставил ваш код, но Xcode 6.1.1 выдавал некоторые ошибки по-моему, в итоге он выглядел так, и он работает как шарм. Благодарность!

func userAlreadyExist(kUsernameKey: String) -> Bool {
    return NSUserDefaults.standardUserDefaults().objectForKey(kUsernameKey) != nil
}
Astun
источник
Работал! Но вы забыли параметр, поэтому я добавил его.
Джесси Онолемен
21

Да, это правильный способ проверить optional, возвращает nilли objectForKeyметод has или любое значение, AnyObject?которое есть Implicit optional.

Итак, если userDefaults.objectForKey(kUSERID)есть какое-либо значение, чем оно оценивается true. если userDefaults.objectForKey(kUSERID)имеет nilзначение, чем оценивается false.

Из руководства по быстрому программированию

Операторы if и принудительное разворачивание. Вы можете использовать оператор if, чтобы узнать, содержит ли необязательный параметр значение. Если необязательный параметр имеет значение, он принимает значение true; если он вообще не имеет значения, он принимает значение false.

Теперь в симуляторах есть ошибка, userDefaultsпоэтому после установки ключа они всегда остаются установленными, независимо от того, удаляете ли вы свое приложение. Вам необходимо сбросить симулятор.

Сбросить Simulator проверить этот метод перед установкой ключа в userDefaultsили вынуть ключ userDefaults.removeObjectForKey(kUSERID)из userDefaults и он будет возвращать NO.А устройство оно разрешаемая iOS8 beta4.

кодер
источник
« objectForKeyметод возвращает, AnyObject!который является неявным необязательным». Это неверно, он возвращаетAnyObject?
Лео Дабус
1
@LeoDabus Swift столько раз менялся. Спасибо, кстати, я это изменил.
codeter 08
по состоянию на 25.10.2016 в документации теперь говорится: «Вы можете использовать оператор if, чтобы узнать, содержит ли необязательный параметр значение, сравнив необязательное значение с nil. Вы выполняете это сравнение с помощью оператора« равно »(= =) или оператор «не равно» (! =) ». Xcode 7.3.1 покажет ошибку компиляции, если вы попытаетесь это сделать, if anOptional { }и предложит вам протестировать с использованием == nil или! =
Nil
14

По сути, это то же самое, что предлагается в других ответах, но более удобным способом (Swift 3+):

extension UserDefaults {
    static func contains(_ key: String) -> Bool {
        return UserDefaults.standard.object(forKey: key) != nil
    }
}

Применение: if UserDefaults.contains(kUSERID) { ... }

Сэр Кодесалот
источник
то имеет смысл сделать функцию статичной , потому что вы обращаетесь одноэлементный стандарт : static func contains(key: String) -> Bool. В противном случае имеет смысл сделать большеreturn self.object(forKey: key) != nil
Nomad Developer
5

Простой код, чтобы проверить, сохранено ли значение в UserDefault.

let userdefaults = UserDefaults.standard
if let savedValue = userdefaults.string(forKey: "key"){
   print("Here you will get saved value")       
} else {
   print("No value in Userdefault,Either you can save value here or perform other operation")
   userdefaults.set("Here you can save value", forKey: "key")
}
Судхи 9135
источник
2

для swift 3.2

func userAlreadyExist(kUsernameKey: String) -> Bool {
    return UserDefaults.standard.object(forKey: kUsernameKey) != nil
}
Джонни Ди Гуд
источник
0
public class PreferencesUtils {

    private init() {

    }

    public static func setBoolData(boolValue: Bool, dataName: String) {
        UserDefaults.standard.set(boolValue, forKey: dataName)
    }

    public static func getBoolData(dataName: String)-> Bool{

        let defaults = UserDefaults.standard

        if(defaults.value(forKey: dataName) != nil) {
            return defaults.value(forKey: dataName)! as! Bool

        } else {
            return false
        }
    }

    public static func saveStringData(data: String, dataName: String){
        let preferences = UserDefaults.standard
        preferences.set(data, forKey: dataName)
        let didSave = preferences.synchronize()
        if !didSave {
            debugPrint("Not saved yet")
        }
    }

    public static func getSavedStringData(dataName: String)-> String{
        let defaults = UserDefaults.standard
        if(defaults.value(forKey: dataName) != nil){
            return defaults.value(forKey: dataName) as! String
        } else {
            return ""
        }
    }

    public static func saveIntData(data : Int, dataName: String){
        let preferences = UserDefaults.standard
        preferences.set(data, forKey: dataName)
        let didSave = preferences.synchronize()
        if !didSave {
            debugPrint("Not saved yet")
        }
    }

    public static func getSavedIntData(dataName: String) -> Int {
        let defaults = UserDefaults.standard
        if(defaults.value(forKey: dataName) != nil){
            return defaults.value(forKey: dataName) as! Int
        }else{
            return 0
        }
    }

}

Или вы можете попробовать эту библиотеку: Ссылка

Джамиль Хаснин Тамим
источник
0
func keyExists(key: String) -> Bool {
    guard let _ = UserDefaults.standard.object(forKey: key) {
     return false;
    }

   return true;
}
Андреа Леганца
источник
Пожалуйста, не публикуйте только код в качестве ответа, но также объясните, что делает ваш код и как он отвечает на вопрос. Ответы с объяснением обычно более полезны и качественнее, и с большей вероятностью получат положительные отзывы.
Марк Роттевил
0

переопределить функцию viewDidLoad () {

super.viewDidLoad ()

если UserDefaults.standard.string (forKey: "ЧАРРИ") == "ЧАРРИ" {

 lb.text = "CHARRY"

 im.image = UIImage(named: "CHARRY")

}}

@IBAction func PressedCar(_ sender: UIButton){

 lb.text = "CHARRY"

 im.image = UIImage(named: "CHARRY")

 UserDefaults.standard.set("CAR", forKey: "CHARRY")


}
Hamayun Zeb
источник
0

Многие из решений здесь действительны. Тем не менее, я думаю, что они решают не ту проблему.

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

if isKeyPresentInUserDefaults(key: "username") {
    return UserDefaults.standard.string(forKey: "username")
} else {
    return "No username was set"
}

Вам все равно, установлен ключ или нет. Существует гораздо более элегантный подход для использования значений по умолчанию в UserDefaults:

UserDefault.standard.register(defaults: ["username": "No username was set"])

Если вы запустите этот код при запуске приложения, последующие вызовы UserDefaults.standard.string(forKey: "username")вернут значение по умолчанию, "No username was set"если для ключа еще не было установлено значение.

Ксавье Лоумиллер
источник