Проверить, существует ли 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
}

29

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

func userAlreadyExist(kUsernameKey: String) -> Bool {
    return NSUserDefaults.standardUserDefaults().objectForKey(kUsernameKey) != nil
}

Работал! Но вы забыли параметр, поэтому я добавил его.
Джесси Онолемен

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")
}


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")


}

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"если для ключа еще не было установлено значение.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.