如何在Swift 3中将数据保存到NSUserDefaults?

时间:2016-09-17 23:31:50

标签: ios swift nsuserdefaults swift3 nskeyedarchiver

我想将数据保存到Swift3中的NSUSerDefaults中:

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

但它崩溃了

NSKeyedArchiver.archivedData(withRootObject: session)

我该如何解决?

2 个答案:

答案 0 :(得分:1)

我认为您的会话类中没有编码和解码方法。 如果您的会话是自定义类,那么您应该编写以下两种方法,而不会使该存档无效。

代码:

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

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

我希望它会对你有所帮助。 快乐的编码...

答案 1 :(得分:-1)

我认为,这是在NSUserDefaults中保存数据的正确方法:

$('.dropdown').hover(function(e){$(this).addClass('open')})
相关问题