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?

Ryan
la source

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
}
user7248923
la source
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
}
Astun
la source
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.

codester
la source
"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) { ... }

Sir Codesalot
la source
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")
}
Sudhi 9135
la source
2

pour swift 3.2

func userAlreadyExist(kUsernameKey: String) -> Bool {
    return UserDefaults.standard.object(forKey: kUsernameKey) != nil
}
Johny D Bon
la source
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

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

   return true;
}
Andrea Leganza
la source
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")


}
hamayun zeb
la source
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é.

Xavier Lowmiller
la source