2016-09-17 3 views
-1

Я хочу, чтобы сохранить данные в NSUserDefaults в Swift3 в:Как сохранить данные в NSUserDefaults в Swift 3?

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

, но он выходит из строя в

NSKeyedArchiver.archivedData(withRootObject: session) 

Как я могу исправить это?

+2

Что такое 'session'? – Aaron

+0

NSUserDefaults поддерживает следующие типы данных: NSString, NSNumber, NSDate, NSArray, NSDictionary и NSData http://stackoverflow.com/questions/37980432/swift-3-saving-and-retrieving-custom-object-from-userdefaults – Rivendell

ответ

1

Я думаю, что вы не кодировали и не декодировали метод в своем классе сеанса. Если ваш сеанс является обычным классом, тогда вы должны написать следующие два метода, без этого архив не будет работать.

Код:

Objective C Версия:

- (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; 
} 

Здесь session_property1 и session_property2 рассматриваются как строки, если переменная отличается от строки вам нужно отформатировать его соответствующим образом.

После них в вашем пореза на классе, если вы будете использовать archiveData метод, как вы это сделали, то он будет архивировать данные, а затем вы можете установить эти данные в NSUserDefault

Swift Версия:

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") 
} 

Я надеюсь, что это вам поможет. Счастливого кодирование ...

+0

вы пишите решение в объективе-c, и вопрос требует быстрой версии кодирования –

+1

@AmrAngry, Спасибо, что напомнил мне. К тому времени я просто дал намек на цель C. Но теперь не беспокойтесь, теперь я обновил свой ответ с помощью Swift. – Janmenjaya

-1

Я думаю, что это правильный путь, чтобы сохранить данные в NSUserDefaults:

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

Сохранение данных в NSUserDefaults уже объяснено сотни раз, ваш ответ ничего не добавляет. Более того, OP специально просит версию Swift 3, которую вы не даете ... – Moritz

Смежные вопросы