Ios 如何在NSUserDefaults中保存任何类

Ios 如何在NSUserDefaults中保存任何类,ios,swift,nsuserdefaults,Ios,Swift,Nsuserdefaults,我尝试了几种不同的方法,可以将这个类保存在NSUserDefaults中。我不知道如何用覆盖函数保存类。我怎样才能做到 class CountryEntity: AnyObject { private(set) var id: UInt = 0 private(set) var name = "" override func cityData(data: Dictionary<String, AnyObject>!) { id = data.uint(key: "id")

我尝试了几种不同的方法,可以将这个类保存在NSUserDefaults中。我不知道如何用覆盖函数保存类。我怎样才能做到

class CountryEntity: AnyObject {
private(set) var id: UInt = 0
private(set) var name = ""

override func cityData(data: Dictionary<String, AnyObject>!) {
    id = data.uint(key: "id")
    name = data.string(key: "name")
}

要在NSUserDefaults中存储自定义类,数据类型需要是NSObject的子类,并且应该遵守NSCoding协议

1) 为数据创建自定义类

class CustomData: NSObject, NSCoding {
let name : String
let url : String
let desc : String

init(tuple : (String,String,String)){
    self.name = tuple.0
    self.url = tuple.1
    self.desc = tuple.2
}
func getName() -> String {
    return name
}
func getURL() -> String{
    return url
}
func getDescription() -> String {
    return desc
}
func getTuple() -> (String,String,String) {
    return (self.name,self.url,self.desc)
}

required init(coder aDecoder: NSCoder) {
    self.name = aDecoder.decodeObjectForKey("name") as! String
    self.url = aDecoder.decodeObjectForKey("url") as! String
    self.desc = aDecoder.decodeObjectForKey("desc") as! String
}

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(self.name, forKey: "name")
    aCoder.encodeObject(self.url, forKey: "url")
    aCoder.encodeObject(self.desc, forKey: "desc")
} 
}
2) 要保存数据,请使用以下功能:

func saveData()
    {
        let data  = NSKeyedArchiver.archivedDataWithRootObject(custom)
        let defaults = NSUserDefaults.standardUserDefaults()
        defaults.setObject(data, forKey:"customArray" )
    }
3) 要检索:

if let data = NSUserDefaults().dataForKey("customArray"),
custom = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [CustomData] {
// Do something with retrieved data
    for item in custom {
    print(item)
    }
}

注意:这里我保存并检索一个自定义类对象数组

要在NSUserDefaults中存储自定义类,数据类型需要是NSObject的子类,并且应该遵守NSCoding协议

1) 为数据创建自定义类

class CustomData: NSObject, NSCoding {
let name : String
let url : String
let desc : String

init(tuple : (String,String,String)){
    self.name = tuple.0
    self.url = tuple.1
    self.desc = tuple.2
}
func getName() -> String {
    return name
}
func getURL() -> String{
    return url
}
func getDescription() -> String {
    return desc
}
func getTuple() -> (String,String,String) {
    return (self.name,self.url,self.desc)
}

required init(coder aDecoder: NSCoder) {
    self.name = aDecoder.decodeObjectForKey("name") as! String
    self.url = aDecoder.decodeObjectForKey("url") as! String
    self.desc = aDecoder.decodeObjectForKey("desc") as! String
}

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(self.name, forKey: "name")
    aCoder.encodeObject(self.url, forKey: "url")
    aCoder.encodeObject(self.desc, forKey: "desc")
} 
}
2) 要保存数据,请使用以下功能:

func saveData()
    {
        let data  = NSKeyedArchiver.archivedDataWithRootObject(custom)
        let defaults = NSUserDefaults.standardUserDefaults()
        defaults.setObject(data, forKey:"customArray" )
    }
3) 要检索:

if let data = NSUserDefaults().dataForKey("customArray"),
custom = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [CustomData] {
// Do something with retrieved data
    for item in custom {
    print(item)
    }
}

注意:这里我保存并检索一个自定义类对象数组

为什么不将每个单独的部分存储在数组中,并生成序列化/反序列化方法()为什么不将每个单独的部分存储在数组中,并生成序列化/反序列化方法()呢请在我的问题上显示我写的更新,我是如何用NSKeyedArchiver@AnkitGoel NSUserDefaults有一个名为dataForKey
的方法,如果let data=NSUserDefaults()。dataForKey(“customArray”){…}
无需强制转换,我将编辑答案。此方法将其保存在UserDefaults本身中,但也使用NSKeyedArchiver。不要使用as!,在条件let中添加第二行并用作
custom=NSKeyedUnarchiver.unarchiveObjectWithData(数据)为?[CustomData]
CustomData它是一个类。你应该以大写字母开始命名请在我的问题上显示我写的更新我是如何尝试用NSKeyedArchiver@AnkitGoel NSUserDefaults有一个名为dataForKey
的方法,如果let data=NSUserDefaults()。dataForKey(“customArray”){…}
无需强制转换,我将编辑答案。此方法将其保存在UserDefaults本身中,但也使用NSKeyedArchiver。不要使用as!,在条件let中添加第二行并用作
custom=NSKeyedUnarchiver.unarchiveObjectWithData(数据)为?[CustomData]
CustomData它是一个类。你应该以大写字母开始命名