在 NSUserDefaults 中保存自定义 NSObject
Saving custom NSObject in NSUserDefaults
我有一个模态实体文件如下,
import UIKit
class MyProfile: NSObject {
var userName : String = ""
func initWithDict(dict: NSMutableDictionary) {
self.userName = dict.objectForKey("username") as! String
}
}
通过如下编码保存该实体,
let myDict: NSMutableDictionary = ["username": "abc"]
let myEntity:MyProfile = MyProfile()
myEntity.initWithDict(myDict)
let userDefaults = NSUserDefaults.standardUserDefaults()
let encodedData = NSKeyedArchiver.archivedDataWithRootObject(myEntity)
userDefaults.setObject(encodedData, forKey: "MyProfileEntity")
userDefaults.synchronize()
获取保存的实体如下,
let myEntity:MyProfile = MyProfile()
let userDefaults = NSUserDefaults.standardUserDefaults()
guard let decodedNSData = userDefaults.objectForKey("MyProfileEntity") as? NSData,
myEntity = NSKeyedUnarchiver.unarchiveObjectWithData(decodedNSData) as? MyProfile!
else {
print("Failed")
return
}
print(myEntity.userName)
它不工作,有崩溃和很多语法错误,我是 swift、
的新手
它显示了一些语法错误,例如 定义与 unarchiveObjectWithData
行中的先前值 冲突。如果我修复了该错误,那么在从 userdefaults 获取实体时它会崩溃。
任何人都可以建议我如何解决它吗?
要将自定义对象保存到用户默认值中,您必须实施 NSCoding 协议。请像这样替换您的自定义数据模型:
class MyProfile: NSObject,NSCoding {
var userName : String = ""
@objc required init(coder aDecoder:NSCoder){
self.userName = aDecoder.decodeObjectForKey("USER_NAME") as! String
}
@objc func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.userName, forKey: "USER_NAME")
}
init(dict: [String: String]) {
self.userName = dict["username"]!
}
override init() {
super.init()
}
}
这是保存和检索 MyProfile 对象的代码:
// Save profile
func saveProfile(profile: MyProfile){
let filename = NSHomeDirectory().stringByAppendingString("/Documents/profile.bin")
let data = NSKeyedArchiver.archivedDataWithRootObject(profile)
data.writeToFile(filename, atomically: true)
}
// Get profile
func getProfile() -> MyProfile?{
if let data = NSData(contentsOfFile: NSHomeDirectory().stringByAppendingString("/Documents/profile.bin")){
let unarchiveProfile = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! MyProfile
return unarchiveProfile
} else{
return nil
}
}
下面是如何使用这些方法的代码片段:
// Create profile object
let profile = MyProfile(dict: ["username" : "MOHAMMAD"])
// save profile
saveProfile(profile)
// retrieve profile
if let myProfile = getProfile(){
print(myProfile.userName)
}else{
print("Profile not found")
}
你不能这样做:
let myEntity:MyProfile = MyProfile()
然后,稍后执行此操作:
myEntity = ...
当使用 'let' 定义某些内容时,您无法更改它。
改为
var myEntity: MyProfile?
有可能
NSKeyedUnarchiver.unarchiveObjectWithData(decodedNSData)
返回零。然后,您通过添加
继续强制解包
as? MyProfile!
尝试将其更改为
as? MyProfile
那晚点看看有没有回本
if let myEntity = myEntity {
print(myEntity.userName)
}
我有一个模态实体文件如下,
import UIKit
class MyProfile: NSObject {
var userName : String = ""
func initWithDict(dict: NSMutableDictionary) {
self.userName = dict.objectForKey("username") as! String
}
}
通过如下编码保存该实体,
let myDict: NSMutableDictionary = ["username": "abc"]
let myEntity:MyProfile = MyProfile()
myEntity.initWithDict(myDict)
let userDefaults = NSUserDefaults.standardUserDefaults()
let encodedData = NSKeyedArchiver.archivedDataWithRootObject(myEntity)
userDefaults.setObject(encodedData, forKey: "MyProfileEntity")
userDefaults.synchronize()
获取保存的实体如下,
let myEntity:MyProfile = MyProfile()
let userDefaults = NSUserDefaults.standardUserDefaults()
guard let decodedNSData = userDefaults.objectForKey("MyProfileEntity") as? NSData,
myEntity = NSKeyedUnarchiver.unarchiveObjectWithData(decodedNSData) as? MyProfile!
else {
print("Failed")
return
}
print(myEntity.userName)
它不工作,有崩溃和很多语法错误,我是 swift、
的新手它显示了一些语法错误,例如 定义与 unarchiveObjectWithData
行中的先前值 冲突。如果我修复了该错误,那么在从 userdefaults 获取实体时它会崩溃。
任何人都可以建议我如何解决它吗?
要将自定义对象保存到用户默认值中,您必须实施 NSCoding 协议。请像这样替换您的自定义数据模型:
class MyProfile: NSObject,NSCoding {
var userName : String = ""
@objc required init(coder aDecoder:NSCoder){
self.userName = aDecoder.decodeObjectForKey("USER_NAME") as! String
}
@objc func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.userName, forKey: "USER_NAME")
}
init(dict: [String: String]) {
self.userName = dict["username"]!
}
override init() {
super.init()
}
}
这是保存和检索 MyProfile 对象的代码:
// Save profile
func saveProfile(profile: MyProfile){
let filename = NSHomeDirectory().stringByAppendingString("/Documents/profile.bin")
let data = NSKeyedArchiver.archivedDataWithRootObject(profile)
data.writeToFile(filename, atomically: true)
}
// Get profile
func getProfile() -> MyProfile?{
if let data = NSData(contentsOfFile: NSHomeDirectory().stringByAppendingString("/Documents/profile.bin")){
let unarchiveProfile = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! MyProfile
return unarchiveProfile
} else{
return nil
}
}
下面是如何使用这些方法的代码片段:
// Create profile object
let profile = MyProfile(dict: ["username" : "MOHAMMAD"])
// save profile
saveProfile(profile)
// retrieve profile
if let myProfile = getProfile(){
print(myProfile.userName)
}else{
print("Profile not found")
}
你不能这样做:
let myEntity:MyProfile = MyProfile()
然后,稍后执行此操作:
myEntity = ...
当使用 'let' 定义某些内容时,您无法更改它。
改为 var myEntity: MyProfile?
有可能
NSKeyedUnarchiver.unarchiveObjectWithData(decodedNSData)
返回零。然后,您通过添加
继续强制解包as? MyProfile!
尝试将其更改为
as? MyProfile
那晚点看看有没有回本
if let myEntity = myEntity {
print(myEntity.userName)
}