Je travaille sur une petite application iPhone et j'utilise NSUserDefaults
comme persistance de données. Il n'a qu'à garder une trace de quelques choses, comme certains noms et certains chiffres, donc je pense que je pourrais aussi bien rester simple.
J'ai trouvé cette page pour référence, mais je ne pense pas qu'elle puisse répondre à ma question. Fondamentalement, je veux pouvoir vérifier si une valeur (ou une clé) existe déjà dans le NSUserDefaults
puis faire quelque chose en conséquence.
Quelques exemples: L'application démarre, si c'est la première fois qu'elle démarre, elle émet une alerte disant bienvenue. Pour savoir si c'est la première fois qu'il s'ouvre, il lit les UserDefaults
vérifications et.
Exemple 2: Il dit, "Bonjour [Nom]", où Nom est quelque chose que vous avez entré. Si vous avez ouvert l'application et qu'il n'y a pas de nom, elle devrait indiquer «Bonjour tout le monde». Je dois vérifier si vous avez déjà entré un nom et agir en conséquence. Le nom serait stocké dans NSUserDefaults
.
Un peu d'aide ici? Je l'apprécierais vraiment!
la source
– dictionaryRepresentation
et vérifier la clé.Comme mentionné ci-dessus, cela ne fonctionnera pas pour les types primitifs où 0 / NO pourrait être une valeur valide. J'utilise ce code.
la source
BOOL
. Il fera une distinction précise entreNO
et non défini, contrairement àobjectForKey:
.objectForKey:
elle reviendranil
quelle que soit l'intention du programmeur de stocker éventuellement unBool
ou tout autre type de données. Lorsqu'une primitive est présente,objectForKey:
ne revient pasnil
même si la clé est associée à une valeur primitive.La
objectForKey:
méthode retourneranil
si la valeur n'existe pas. Voici un test IF / THEN simple qui vous dira si la valeur est nulle:la source
" objectForKey retournera nil s'il n'existe pas. " Il renverra également nil s'il existe et s'il s'agit soit d'un entier soit d'un booléen avec une valeur de zéro (c'est-à-dire FAUX ou NON pour le booléen).
J'ai testé cela dans le simulateur pour 5.1 et 6.1. Cela signifie que vous ne pouvez pas vraiment tester si des entiers ou des booléens ont été définis en demandant "l'objet". Vous pouvez vous en tirer avec les entiers si cela ne vous dérange pas de traiter "non défini" comme s'il était "mis à zéro".
Les personnes qui ont déjà testé cela semblent avoir été dupées par le faux aspect négatif, c'est-à-dire le tester en voyant si objectForKey renvoie nil lorsque vous savez que la clé n'a pas été définie, mais ne remarquant pas qu'il renvoie également nil si la clé a été mais a été réglé sur NO.
Pour mon propre problème, qui m'a envoyé ici, je viens de changer la sémantique de mon booléen afin que la valeur par défaut que je souhaite soit en accord avec la valeur définie sur NO. Si ce n'est pas une option, vous devrez stocker autre chose qu'un booléen et vous assurer que vous pouvez faire la différence entre OUI, NON et "non défini".
la source
@0
au lieu de0
,@NO
au lieu deNO
, ou tout simplement@(variable)
. Lisez à leur sujet ici.Swift 3/4:
Voici une extension simple pour les types de valeur-clé Int / Double / Float / Bool qui imitent le comportement de retour facultatif des autres types accessibles via UserDefaults.
( Modifier le 30 août 2018: mise à jour avec une syntaxe plus efficace d'après la suggestion de Leo.)
Ils sont désormais plus cohérents aux côtés des autres méthodes get intégrées (chaîne, données, etc.). Utilisez simplement les méthodes get à la place des anciennes.
la source
return self.object(forKey: key) as? Int
pour rechercher une valeur une seule fois.Je viens de passer par là, et tout vos réponses m'ont aidé à trouver une bonne solution pour moi. J'ai résisté à suivre l'itinéraire suggéré par, juste parce que j'avais du mal à lire et à comprendre.
Voici ce que j'ai fait. J'avais un BOOL transporté dans une variable appelée "_talkative".
Lorsque j'ai défini mon objet par défaut (NSUserDefaults), je l'ai défini comme un objet, car je pouvais alors tester pour voir s'il était nul:
Puis quand je suis allé voir si ça existait, j'ai utilisé:
Ensuite, j'ai utilisé l'objet comme BOOL:
Cela semble fonctionner dans mon cas. Cela me faisait juste plus de sens visuel.
la source
Essayez ce petit crumpet:
Traitez tout comme un objet. Semble fonctionner pour moi.
la source
Version rapide pour obtenir
Bool?
la source
boolForKey
?NSUserDefaults.standardUserDefaults().boolForKey(DefaultsIsGiver)
boolForKey
reviendraBool
et nonBool?
, donc si la clé n'est pas là, vous obtiendrezfalse
et nonnil
Étendez
UserDefaults
une fois pour ne pas copier-coller cette solution:la source
Dans Swift3, j'ai utilisé de cette façon
La réponse est excellente si vous devez l'utiliser plusieurs fois.
J'espère que ça aide :)
la source
Swift 3.0
la source