swift学习笔记(一)NSUserDefaults存储对象的方法

来源:互联网 发布:sqlserver教程推荐 编辑:程序博客网 时间:2024/05/03 08:49

在处理Swift持久化内容的时候,使用到了NSUserDefaults来保存数据,但是在实现过程中发现正常的对象无法保存,会报很多错,对象如下(简单的Student对象)

class Student {  var name: String?  var id: Int?}
该对象在存储过程中,即如下方式存储时会报各种错误

let student = Student()let defaults = NSUserDefaults.standardUserDefaults()defaults.setObject(strDict, forKey: "strDict")defaults.synchronize()

其中需要继承NSObject类和NSCoding类,并且需要重写NSObject类中的description属性(如果需要的话)和无参构造,NSCoding类中的

requiredinit?(coder aDecoder:NSCoder)构造和

encodeWithCoder(aCoder:NSCoder)方法

改造如下:

class Student: NSObject, NSCoding{    var name: String?    var id: Int?    override var description: String {        get {            return "name: " + name! + "  id: \(id)"        }    }        override init() {            }        required init?(coder aDecoder: NSCoder) {        self.id = aDecoder.decodeObjectForKey("id") as? Int        self.name = aDecoder.decodeObjectForKey("name") as? String    }        func encodeWithCoder(aCoder: NSCoder) {        aCoder.encodeObject(name, forKey: "name")        aCoder.encodeObject(id, forKey: "id")    }}
无参构造不必实现什么或者赋值什么,如果你想在构造时就对对象属性赋值也可以重写有参构造

改造完毕之后借助NSData来实现在NSUserDefaults中对象的保存,代码如下所示:这里仅以Array类型作为示例,当类继承了NSObject和NSCoding后,对象,Array,Dictionary均能正常的存储

var students = [Student]()students.append(student1)students.append(student2)students.append(student3)            let data: NSData = NSKeyedArchiver.archivedDataWithRootObject(students)defaults.setObject(data, forKey: "array")
下面这句话我也在网上查了好多资料,其实是写不写都一样,只是用来保证在异常关闭前能存储正常
defaults.synchronize()
读取方式如下:

let one = defaults.objectForKey("array") as? NSDataif one != nil {<span style="white-space:pre"></span>let student = NSKeyedUnarchiver.unarchiveObjectWithData(one!)<span style="white-space:pre"></span>print((student as! [Student]).description)}

以上,本人初学Swift,如有错误的地方,还请不吝指正,多谢


0 0