Ios 在NSUserDefaults中保存自定义NSObject
我有一个模态实体文件,如下所示Ios 在NSUserDefaults中保存自定义NSObject,ios,swift,nsuserdefaults,nsobject,nskeyedarchiver,Ios,Swift,Nsuserdefaults,Nsobject,Nskeyedarchiver,我有一个模态实体文件,如下所示 import UIKit class MyProfile: NSObject { var userName : String = "" func initWithDict(dict: NSMutableDictionary) { self.userName = dict.objectForKey("username") as! String } } let myDict: NSMutableDictionary = [
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)
通过如下编码保存该实体
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)
获取保存的实体,如下所示
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")
}
要将自定义对象保存到用户默认值,必须实现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)
}
你不能这样做:
let myEntity:MyProfile = MyProfile()
随后,请执行以下操作:
myEntity = ...
当某物被定义为“let”时,你不能改变它
改为
var myEntity:MyProfile
有可能
NSKeyedUnarchiver.unarchiveObjectWithData(decodedNSData)
返回零。然后,继续通过添加来强制展开
as? MyProfile!
尝试将此更改为
as? MyProfile
然后等会儿,看看你有没有什么东西回来
if let myEntity = myEntity {
print(myEntity.userName)
}
您遇到了什么错误?@ryantxr,它显示了一些语法错误,例如定义与以前的值冲突……如果需要帮助,您需要具体说明。使用完整准确的错误消息更新您的问题,并指出导致错误的确切行。@rmaddy,已编辑该问题。您遇到了哪些错误?@ryantxr,它显示了一些语法错误,例如定义与以前的值冲突……如果需要帮助,您需要具体说明。用完整、准确的错误消息更新您的问题,并指出导致错误的确切行。@rmaddy,编辑了问题。感谢您的回复,u pl是否也可以给出保存和检索语法。。。?关于该部分的主要问题请查看我编辑的答案。希望您会喜欢:)再次感谢,但是在创建MyProfile时,上面的代码中有一个错误,“调用中的参数标签不正确-
let profile=MyProfile”(dict:
…,如何修复?我尝试了coder而不是dict,但没有运气…它工作得很好,节省了很多时间,希望它对其他人也没有帮助。谢谢你的回复,你能给出保存和检索语法吗…?该部分的主要问题hi@NAZIK检查我编辑的答案。希望你会喜欢:)再次感谢您,但是在创建MyProfile时,您上面的代码中出现了一个错误,“调用中的参数标签不正确-让profile=MyProfile(dict:
…),如何修复?我尝试了coder而不是dict,但没有运气…它工作得很好,节省了很多时间,希望它也能帮助其他人。