2016-09-17 3 views
-1

Ich möchte, dass meine Daten in NSUserDefaults in swift3 in sparen:Wie speichert man Daten in NSUserDefaults in Swift 3?

func a() { 
    let userDefaults = UserDefaults.standard 
    let sessionData = NSKeyedArchiver.archivedData(withRootObject: session) 
    userDefaults.set(session, forKey: "SpotifySession") 
    userDefaults.synchronize() 
} 

aber stürzt in

NSKeyedArchiver.archivedData(withRootObject: session) 

, wie ich das beheben kann?

+2

Was ist 'session'? – Aaron

+0

NSUserDefaults unterstützt die folgenden Datentypen: NSString, NSNumber, NSDate, NSArray, NSDictionary und NSData http://stackoverflow.com/questions/37980432/swift-3-saving-and-retrieving-custom-object-from-userdefaults – Rivendell

Antwort

1

Ich denke, Sie haben nicht codieren und dekodieren Methode in Ihrer Sitzung Klasse. Wenn Ihre Sitzung benutzerdefinierte Klasse ist, sollten Sie die folgenden zwei Methoden schreiben, ohne dass das Archiv nicht funktioniert.

Code:

Objective C Version:

- (void)encodeWithCoder:(NSCoder *)encoder { 
[encoder encodeObject:self.session_property1 forKey:@"session_property1"]; 
    [encoder encodeObject:self.session_property2 forKey:@"session_property2"]; 
} 

- (id)initWithCoder:(NSCoder *)decoder { 
    if((self = [super init])) { 
     //decode properties, other class vars 
     self.ession_property1 = [decoder decodeObjectForKey:@"ession_property1"]; 
     self.ession_property2 = [decoder decodeObjectForKey:@"ession_property2"]; 
} 
    return self; 
} 

Hier session_property1 und session_property2 werden als String betrachtet, wenn Ihre Variable als Zeichenfolge andere ist, müssen Sie es entsprechend zu formatieren.

Nachdem diese in Ihren Schnitt auf Klasse, wird, wenn Sie archiveData Methode verwenden, wie Sie getan haben, dann werden die Daten archivieren und dann können Sie diese Daten an NSUserDefault

Swift Version gesetzt:

required init(coder decoder: NSCoder) { 
    self.state = decoder.decodeObject(forKey: "state") as? String 
    self.country = decoder.decodeObject(forKey: "country") as? String 
    self.zip = decoder.decodeObject(forKey: "zip") as? String 
    self.locality = decoder.decodeObject(forKey: "locality") as? String 
    self.city = decoder.decodeObject(forKey: "city") as? String 
    self.latitude = decoder.decodeObject(forKey: "latitude") as? Double 
    self.longitude = decoder.decodeObject(forKey: "longitude") as? Double 
} 

func encode(with coder: NSCoder) { 
    coder.encode(state, forKey: "state") 
    coder.encode(country, forKey: "country") 
    coder.encode(zip, forKey: "zip") 
    coder.encode(locality, forKey: "locality") 
    coder.encode(city, forKey: "city") 
    coder.encode(latitude, forKey: "latitude") 
    coder.encode(longitude, forKey: "longitude") 
} 

Ich hoffe, es wird Ihnen helfen. Glücklich Codierung ...

+0

Sie schreiben Lösung in objective-c und die Frage bittet um schnelle Codierung Version –

+1

@AmrAngry, Danke für die Erinnerung an mich. Ich gab zu diesem Zeitpunkt nur den Hinweis mit Ziel C. Aber jetzt keine Sorgen, ich habe meine Antwort jetzt mit Swift aktualisiert. – Janmenjaya

-1

Ich denke, das ist der richtige Weg, um Daten in NSUserDefaults zu speichern:

let defaults = NSUserDefaults.standardUserDefaults() 
defaults.setObject("Coding Explorer", forKey: "userNameKey") 
+1

Das Speichern von Daten in NSUserDefaults wurde bereits hunderte Male erläutert, Ihre Antwort fügt nichts hinzu. Darüber hinaus bittet OP ausdrücklich um eine Swift 3-Version, die Sie nicht geben ... – Moritz

Verwandte Themen