Vérifier si UserDefault existe - Swift


87

J'essaye de vérifier si le défaut d'un utilisateur existe, vu ci-dessous:

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

    if userDefaults.objectForKey(kUSERID) {
        return true
    }

    return false
}

Cependant, peu importe ce qu'il retournera toujours vrai même si l'objet n'existe pas encore? Est-ce la bonne façon de vérifier l'existence?

Réponses:


127

Astun a une excellente réponse. Voir ci-dessous pour la version Swift 3.

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

29

J'ai copié / collé votre code mais Xcode 6.1.1 me lançait des erreurs, ça a fini par ressembler à ça et ça marche comme un charme. Merci!

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

Travaillé! Mais vous avez oublié le paramètre, alors je l'ai ajouté.
Jesse Onolemen

21

Oui, c'est la bonne façon de vérifier la méthode optionalhave nilou n'importe quelle valeur qui est objectForKeyrenvoyée .AnyObject?Implicit optional

Donc si userDefaults.objectForKey(kUSERID)avoir une valeur à laquelle il évalue true. si userDefaults.objectForKey(kUSERID)a une nilvaleur à laquelle il évalue false.

À partir du guide de programmation rapide

Instructions If et décompression forcée Vous pouvez utiliser une instruction if pour savoir si une option contient une valeur. Si un optionnel a une valeur, il prend la valeur true; s'il n'a aucune valeur du tout, il prend la valeur false.

Maintenant, il y a un bogue dans les simulateurs, userDefaultscar après avoir défini la clé, ils restent toujours définis, peu importe que vous supprimiez votre application.Vous devez réinitialiser le simulateur.

Réinitialiser votre simulateur vérifier cette méthode avant de clé userDefaultsou retirer la clé userDefaults.removeObjectForKey(kUSERID)de userDefaults et il retournera des NOdispositifs .oN il est résolu dans iOS8 beta4.


"La objectForKeyméthode retourne AnyObject!qui est implicite facultative" C'est faux, elle retourneAnyObject?
Leo Dabus

1
@LeoDabus Swift a changé tant de fois. Merci BTW, j'ai changé cela.
codester

à partir du 25/10/2016, la ligne dans la documentation dit maintenant "Vous pouvez utiliser une instruction if pour savoir si un optionnel contient une valeur en comparant le optionnel à nil. Vous effectuez cette comparaison avec l'opérateur" égal à "(= =) ou l'opérateur «différent de» (! =). " Xcode 7.3.1 affichera une erreur de compilation si vous essayez if anOptional { }et il vous suggérera de tester en utilisant == nil ou! =
Nil

14

C'est essentiellement le même que celui suggéré dans d'autres réponses mais d'une manière plus pratique (Swift 3+):

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

usage: if UserDefaults.contains(kUSERID) { ... }


alors il est logique de faire la statique de fonction parce que vous accédez à un singleton norme : static func contains(key: String) -> Bool. Sinon, cela a plus de sens à fairereturn self.object(forKey: key) != nil
Développeur nomade

5

Code simple pour vérifier si la valeur stockée dans 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")
}

2

pour 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
        }
    }

}

Ou vous pouvez essayer cette bibliothèque: Lien


0
func keyExists(key: String) -> Bool {
    guard let _ = UserDefaults.standard.object(forKey: key) {
     return false;
    }

   return true;
}

Veuillez ne pas publier uniquement le code comme réponse, mais également expliquer ce que fait votre code et comment il répond à la question. Les réponses avec une explication sont généralement plus utiles et de meilleure qualité, et sont plus susceptibles d'attirer des votes positifs.
Mark Rotteveel

0

remplacer la fonction viewDidLoad () {

super.viewDidLoad ()

if UserDefaults.standard.string (forKey: "CHARRY") == "CHARRY" {

 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

Beaucoup de solutions ici sont valables. Pourtant, je pense qu'ils résolvent le mauvais problème.

Habituellement, un code comme celui-ci est utilisé pour vérifier si une valeur est définie afin qu'une autre valeur par défaut puisse être utilisée:

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

Vous ne devriez pas vous soucier si une clé est définie ou non. Il existe une approche beaucoup plus élégante pour avoir des valeurs par défaut dans UserDefaults:

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

Si vous exécutez ce code au lancement de l'application, les appels suivants à UserDefaults.standard.string(forKey: "username")renverront la valeur par défaut de "No username was set"si aucune valeur n'a encore été définie pour la clé.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.