2016-05-26 8 views
0

möchte nur wissen, warum ein Code Arbeit und der andere nicht hat, wenn ein Wert von NSUserDefaultWarum funktioniert ein Code, aber der andere nicht mit NSUserDefaults?

Abrufen

Hier ist, wie ich die Informationen in NSUserDefaults speichern:

let prefs = NSUserDefaults.standardUserDefaults() 
prefs.setValue(user_names, forKey: "username") //storing the username "test" 

dies ist, wie ich das abrufen NSUserDefaults Info:

let prefs = NSUserDefaults.standardUserDefaults() //preference name 

let username1 = prefs.stringForKey("username") //doesn't work 
let username2: [NSString]? = NSUserDefaults.standardUserDefaults().objectForKey("username") as? [NSString] //works 

print(username1) //doesn't work - "nil" 
print(username2) //works - "test" 

kann mir jemand erklären, warum username1 funktioniert nicht aber username2 funktioniert? Dank

+1

Datentyp USER_NAMES ist? –

+0

@ Mr.UB "test" ... – johnjay22113

+1

@ johnjay22113 Also ein 'String'? Ihr Code zeigt an, dass es sich um ein Array von Strings handelt, d. H. '[String]'.Sie versuchen, sowohl ein Array von Strings als auch einen einzelnen String vom selben Key abzurufen, daher ist es logisch, dass nur einer von ihnen funktionieren könnte - da die Benutzerstandards entweder einen '[String]' oder 'String' für Ein gegebener Schlüssel kann nicht beides enthalten. – Hamish

Antwort

2

Der normale Weg ist der zweite Weg. Dies ist, wie Sie tun sollten, es

let myString = "Test" 
var myStringArray = ["Test"] 

Um

NSUserDefaults.standardUserDefaults().setObject(myString, forKey: "Key") 

NSUserDefaults.standardUserDefaults().setObject(myStringArray, forKey: "Key") 

zu speichern Um den Wert auf sichere Weise zu erhalten (objectForKey Null zurückkehren kann, wenn nicht zum ersten Mal eingestellt)

NSUserDefaults.standardUserDefaults().objectForKey("Key") as? String ?? myString 

NSUserDefaults.standardUserDefaults().objectForKey("Key") as? [String] ?? myStringArray 

Sie überprüfen, ob das Objekt existiert (als? ...), und wenn es nicht die Standardwerte in Ihrer Eigenschaft verwendet (?? ...)

1

Wie Sie im Apple documentation Sie nur speichern kann sehen:

Ein Standardobjekt muss eine Eigenschaftsliste sein, das heißt, eine Instanz (oder für Sammlungen eine Kombination von Instanzen): NSData, NSString, NSNumber, NSDate, NSArray oder NSDictionary. Wenn Sie einen anderen Objekttyp speichern möchten, sollten Sie ihn normalerweise archivieren, um eine Instanz von NSData zu erstellen.

Also, wenn Sie Objekt speichern möchten, die unterschiedliche Art haben Sie, dies zu tun:

let data = NSKeyedArchiver.archivedDataWithRootObject(yourObject) 
let defaults = NSUserDefaults.standardUserDefaults() 
defaults.setObject(data, forKey:"yourObject") 

Dann, wenn Sie es abrufen möchten:

if let data = NSUserDefaults.standardUserDefaults().objectForKey("yourObject") as? NSData 
    { 
    let yourObject = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! YourObjectType 

    } 

hoffe, dies wird Ihnen helfen, !

+0

Ich möchte String speichern. Mache ich es richtig mit dem Code, den ich verwendete? – johnjay22113

+0

Ich habe eine Antwort geschrieben, die dir helfen sollte – crashoverride777

0

stringForKey gibt ein optionales Argument zurück, so dass Sie den Nullkoaleszenzoperator "??" verwenden können. um eine leere Zeichenkette "" im Fall von Null zurückzugeben:

Lassen Sie username1 = prefs.stringForKey ("Benutzername") ?? "

0

Ich habe versucht, Ihren Code und es funktioniert für mich. Sie können dieses -Code in Bildern überprüfen: -

let user_names = "test" 
    let prefs = NSUserDefaults.standardUserDefaults() 
    prefs.setValue(user_names, forKey: "username") 
    let username1 = prefs.stringForKey("username") 
    print(username1!) 

OutPut Bild: -

OutPut Image