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,但没有运气…它工作得很好,节省了很多时间,希望它也能帮助其他人。