【问题标题】:How to save data to NSUserDefaults in Swift 3?如何在 Swift 3 中将数据保存到 NSUserDefaults?
【发布时间】:2026-01-20 20:50:01
【问题描述】:

我想将我的数据保存到 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)

我该如何解决这个问题?

【问题讨论】:

  • 什么是session
  • NSUserDefaults 支持以下数据类型:NSString、NSNumber、NSDate、NSArray、NSDictionary 和 NSData *.com/questions/37980432/…

标签: ios swift nsuserdefaults swift3 nskeyedarchiver


【解决方案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")
} 

希望对你有所帮助。 快乐编码...

【讨论】:

  • 你在objective-c中编写解决方案,问题是要求快速编码版本
  • @AmrAngry,谢谢你提醒我。那时我只是在用目标 C 给出提示。但现在不用担心,我现在用 Swift 更新了我的答案。
【解决方案2】:

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

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

【讨论】:

  • 在 NSUserDefaults 中保存数据已经被解释了数百次,你的回答什么也没有。此外,OP 专门要求提供 Swift 3 版本,但您没有提供...
最近更新 更多