- 首先,我们需要将数据进行编码并存储到UserDefaults中。可以使用NSKeyedArchiver类对数据进行编码。这样,我们可以轻松地将对象编码成NSData,然后使用UserDefaults进行存储。
let data = try NSKeyedArchiver.archivedData(withRootObject: object, requiringSecureCoding: false)
UserDefaults.standard.set(data, forKey: "key")
- 当需要从UserDefaults中获取数据时,我们可以使用object(forKey:)方法获取NSData,使用NSKeyedUnarchiver解码它,并将其转换为需要的类型。注意,使用
unarchiveTopLevelObjectWithData
会崩溃,要使用unarchiveObject(with:)
。
if let data = UserDefaults.standard.object(forKey: "key") as? NSData {
if let object = try NSKeyedUnarchiver.unarchiveObject(with: data as Data) as? MyObject {
// do something with the object
}
}
- 如果仍然出现NSInvalidArgumentException崩溃,则可能是由于数据编码或解码时的错误导致的。您可以尝试将-encode(with:)和-init(coder:)方法实现在您的对象中,以确保正确的编码和解码。
class MyObject: NSObject, NSCoding {
var name: String?
var age: Int?
func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: "name")
aCoder.encode(age, forKey: "age")
}
required init?(coder aDecoder: NSCoder) {
name = aDecoder.decodeObject(forKey: "name") as? String
age = aDecoder.decodeObject(forKey: "age") as? Int
}
}