2017-10-04 2 views
0

J'ai lu les documents (The Swift Programming Language).Quelle est la meilleure façon de stocker et retourner un tableau dans Swift

Toutes les vidéos sur Youtube sont sur NSUserdefaults que je pense que c'est l'ancienne version de UserDefaults non?

Toute façon de retourner un tableau de Int, je peux le faire comme ceci:

arr = UserDefaults.standard.array(forKey: "MyArray") as? [Int] ?? [Int]() 

OU comme ceci:

arr = (UserDefaults.standard.array(forKey: "MyArray") as? [Int])! 

Ou comme ceci:

if let arr = UserDefaults.standard.array(forKey: "MyArray") { 

} 

Je suis totalement confus, je ne suis pas sûr de quelle manière est la meilleure façon ou quelle est la différence. Quelqu'un pourrait me dire quelle est la meilleure façon de retourner un tableau de Int, String, Bool, ou un Any objet Array.

+0

L'option 2 est très mauvaise. Les options 1 et 3 dépendent de vos besoins. Les deux sont valides. – rmaddy

+0

La "différence" est qu'ils font des choses complètement différentes. Faites la chose que vous voulez faire. Ou autre chose. La programmation consiste à mettre vos désirs en langage informatique. Il ne s'agit pas de choisir parmi une pile d'options fixes. Pensez à ce que vous voulez faire et faites-le. – matt

+0

"Je pense que c'est l'ancienne version de Userdefaults" ... Vous pouvez considérer 'UserDefaults' comme l'interface Swift de' NSUserDefaults'. Allez dans la [documentation en ligne] (https://developer.apple.com/documentation/foundation/userdefaults) et basculez entre Swift et Objective-C et il suffit de faire la va-et-vient entre 'UserDefaults' et' NSUserDefaults'. – Rob

Répondre

1

La chose à propos array(forKey:) est:

  • Il est une option.

  • Il peut s'agir de nil.

  • Même si ce n'est pas nil, lorsqu'il est déballé, il s'agit d'un tableau non typé - [Any].

Un optionnel doit être déballé pour être utile. Un [Any] doit être converti en un type de tableau spécifique, tel que [Int], pour être utile. Mais:

  • Si vous déballez nil, vous allez tomber en panne.

  • Si vous lancez quelque chose qui n'est en fait pas un [Int] jusqu'à un [Int], vous allez planter.

Ainsi, le défi si vous pensez que cela pourrait être un [Int] est de déballer le en option en toute sécurité (sans écraser) et jeté le tableau résultant jusqu'à une [Int]en toute sécurité (sans écraser).

C'est l'objectif de vos extraits les plus sensibles (le premier et le troisième). Bu exactement comment vous "épeler" faire cette tâche ne fait aucune différence. Tout dépend de la façon dont vous voulez procéder si le déballage ou la distribution ne fonctionne pas. Faites tout ce qui vous donne un résultat cohérent dans les circonstances.

Tout comme une question de style personnel, ce que je dirais probablement (pas l'une des options que vous avez suggéré):

if let arr = UserDefaults.standard.array(forKey: "MyArray") as? [Int] { 

L'avantage est qu'il vérifie que le résultat n'est pas nil et contrôles qu'il peut être déballé et jeté à [Int], et le fait, en toute sécurité, si la réponse est oui, tout en un coup.

+0

Merci beaucoup, c'est très apprécié. Mais juste pour m'assurer que je peux différencier entre déballer et zéro, pensez-vous que c'est juste? 'si laissez myObj = UserDefaults .... {}' Ceci déballe 'if myObj! = Nil {}' Ceci vérifie nil. correct? – codeDojo

+0

Oui, bien que vous puissiez faire plus que cela. 'si laissez myObj = UserDefaults .... comme? [Int] 'fera tout en un coup: il vérifie que le résultat est' nil' et vérifie qu'il peut être réduit à '[Int]' et ne fonctionne que si la réponse à tous les deux est oui. Ce n'était pas une de vos options, mais c'est ce que je ferais personnellement. Je vais ajouter cela à ma réponse. – matt

+0

Merci beaucoup beaucoup !!!!! Apprécié! – codeDojo