2017-10-18 1 views
1

Je souhaite conserver une synchronisation variable avec UserDefaults directement lorsque je définis une valeur. Je l'ai fait comme ceci:Bonne façon de synchroniser une variable avec UserDefaults

var userId: String { 
    get { 
     return UserDefaults.standard.string(forKey: kUserIdKey) ?? "" 
    } 
    set { 
     UserDefaults.standard.set(newValue, forKey: kUserIdKey) 
    } 
} 

Cela fonctionne bien mais est-ce la bonne façon de le faire?

Si oui, qu'en est-il de Array?

var tagsList: [Int] { 
    get { 
     return (UserDefaults.standard.object(forKey: kTagsList) as? [Int]) ?? [Int]() 
    } 
    set { 
     UserDefaults.standard.set(newValue, forKey: kTagsList) 
    } 
} 

Si j'ajoute un élément tagsList.append(0), est la nouvelle valeur stockée dans UserDefaults?

Mise à jour.

Voici ce que j'ai dans la cour de récréation: enter image description here

+0

avez-vous essayé de le déboguer et de vérifier comment ressemble 'newValue'? –

Répondre

2

Réponse courte: Oui. Réponse longue: Les tableaux et les chaînes sont struct s dans Swift, qui effectue sémantiquement une toute nouvelle copie en cas de mutation.

Le newValue dans le setter est donc le tableau résultant de la mutation que vous avez appliquée au tableau, qu'il s'agisse d'une append ou d'autres fonctions de mutation.

Vous pouvez facilement vérifier ce comportement dans un terrain de jeu comme celui-ci:

var array: [Int] { 
    get { return [1, 2, 3] } 
    set { print(newValue) } 
} 

array.append(4) 
// Prints [1, 2, 3, 4] 
2

Si j'ajoute un élément tagsList.append (0), est la nouvelle valeur stockée dans UserDefaults?

OUI.

En bref, vous avez un compositeur et, en tant que compositeur, il observe que la valeur chaque fois que vous faites une nouvelle affectation, comme:

tagsList = [1,2,3] // nouvelle valeur.

Si Array<Int> ([Int]) était classe, nous pourrions dire que, même si vous modifiez le tableau existant en appelant append, il ne s'agit pas d'une affectation en soi. Cependant, [Int] n'est pas un class, c'est un struct ce qui signifie que toute fonction qui modifie (mute, pour être correct) existant struct, conduit fondamentalement à une nouvelle affectation. C'est la raison pour laquelle vous verriez setter à déclencher.