2016-07-21 3 views
0

У меня есть эта странная проблема. Я сохраняю пользовательский объект класса в NSUserDefaults, и, получая данные, получаю nil для переменной int. Ниже пользовательский классiOS: переменная int пользовательского объекта возвращает nil в NSUserDefaults

class User { 
    var name: String? 
    var user_id: Int? 
    var account_id: Int? 
    var location: String? 
} 

Я сохраняю объект как,

let defaults = NSUserDefaults.standardUserDefaults() 
var data = NSKeyedArchiver.archivedDataWithRootObject([user]) // I can see the int values for the user objects here 
defaults.setObject(data, forKey: "all_users") 

Извлечение данных как,

let defaults = NSUserDefaults.standardUserDefaults() 

let data = defaults.dataForKey("all_users") 
var users = [Users]() 
if data != nil { 
    let userData = NSKeyedUnarchiver.unarchiveObjectWithData(data!) as! [Users] 

    for usr in userData { 
     print("\(usr.name!)") // Prints the name 
     print("\(usr.user_id!)") // Nil value here 
     users.append(usr) 
    } 
} 

Я не имею ни малейшего представления о причине такого поведения ,

+1

Ваш класс должен соответствовать 'NSCoding' – dan

+1

Вы, возможно, придется написать собственный' Archiver'. http://stackoverflow.com/questions/2315948/how-to-store-custom-objects-in-nsuserdefaults – Putz1103

+0

@ Putz1103 Я уже видел это решение, но не пытался, пока вы не указали его здесь. Работает. Благодаря! –

ответ

2

Пользовательские классы, которые не имеют элементов списка свойств, должны соответствовать NSCoding, чтобы они могли быть сохранены в NSUserDefaults.

Вот руководство, чтобы в соответствии с NSCoding: http://nshipster.com/nscoding/

Вам потребуется обе эти функции:

init(coder decoder: NSCoder) { 
    self.name = decoder.decodeObjectForKey("name") as String 
    self.user_id = decoder.decodeIntegerForKey("user_id") 
    self.account_id = decoder.decodeIntegerForKey("account_id") 
    self.location = decoder.decodeObjectForKey("self.location") as String 

} 

func encodeWithCoder(coder: NSCoder) { 
    coder.encodeObject(self.name, forKey: "name") 
    coder.encodeInt(self.user_id, forKey: "user_id") 
    coder.encodeInt(account_id, forKey: "account_id") 
    coder.encodeObject(self.location, forKey: "location") 

}