2016-07-21 1 views
0

이 이상한 문제가 있습니다. 나는 사용자 정의 클래스 객체를 NSUserDefaults에 저장하고 데이터를 가져 오는 동안 객체의 변수 int에 대해 nil을 얻습니다. 다음은 사용자 정의 클래스iOS : NSUserDefaults에서 사용자 정의 객체의 int 변수가 nil을 반환합니다.

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

'을 준수 할 필요가 당신은'직접 작성해야 할 수도 있습니다 http://nshipster.com/nscoding/

당신은 이러한 기능을 모두 필요합니다 여기

는 NSCoding을 준수에 대한 안내입니다 아카이버 '. http://stackoverflow.com/questions/2315948/how-to-store-custom-objects-in-nsuserdefaults – Putz1103

+0

@ Putz1103 나는 이미 그 해결책을 보았지만 당신이 그것을 지적 할 때까지 시도하지 않았다. 효과가 있습니다. 감사! –

답변

2

속성 목록 항목이없는 사용자 지정 클래스는 NSUserDefaults에 저장할 수 있도록 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") 

} 
관련 문제