web-dev-qa-db-fra.com

Utilisation de NSUserDefaults avec Xcode 8 et iOS 10

NSUserDefaults ne semble plus être une classe dans le SDK iOS 10:

let defaults = NSUserDefaults.standardUserDefaults()

Cela ne parvient pas à compiler. Cette classe a-t-elle été supprimée?

(Il s'agit d'une paire de questions et réponses canoniques pour éviter le flot de questions en double)

29
JAL

NSUserDefaults a été renommé UserDefaults. standardUserDefaults() a été renommé standard().

let defaults = UserDefaults.standard

Cela fonctionne maintenant.

Lien de documentation de pré-version .

47
JAL

Pour être plus précis, utilisez UserDefaults dans Swift-3: -

       //To save the string 
       let userDefaults = UserDefaults.standard
       userDefaults.set( "String", forKey: "Key")

       //To retrieve from the key
       let userDefaults = UserDefaults.standard
       let value  = userDefaults.string(forKey: "Key")
       print(value)
20
Shrawan

@ La réponse de JAL est correcte, mais peut-être trop précise.

Beaucoup de l'API a été renommé en Swift 3. La plupart des types de Fondation (NSUserDefaults parmi eux) ont tous deux perdu leur NS préfixe et avait leurs méthodes renommé pour refléter Lignes directrices de l'API Swift . Foundation "remplace" également * un tas de ses classes de types de données de base (NSURL, NSIndexPath, NSDate, etc.) avec Swift-native types de valeur (URL, IndexPath, Date, La méthode de changement de nom s'applique également à toutes les autres API Cocoa/Cocoa Touch que vous utilisez dans votre application.

Traiter ces problèmes un par un, ligne par ligne, est un moyen sûr de devenir fou. La première chose que vous faites lorsque vous déplacez un projet vers Swift 3 doit être de choisir Modifier> Convertir> En courant Swift Syntaxe dans la barre de menus. Ceci appliquera toutes les modifications à la fois, y compris les cas où une ligne de code est affecté par plusieurs changements (et donc les traiter individuellement ne vous mènera peut-être pas où vous pensez que vous allez).

* Je mets "remplace" entre guillemets parce que les classes NS correspondantes sont toujours là pour les cas où vous pourriez en avoir besoin, mais toute API qui les utilise fait référence aux nouveaux types de valeur à la place: par exemple tableView(_:cellForRowAt:) prend maintenant un IndexPath, pas un NSIndexPath.

16
rickster