在 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)
}