[第1章]数据:NSUserDefaults的使用

来源:互联网 发布:淘宝商城魅族 编辑:程序博客网 时间:2024/06/14 11:53

一、配置

得到默认的NSUserDefaults

var defaults = NSUserDefaults.standardUserDefaults()



二、存入默认的plist文件

1、存入

// 为了调用方便,封装成方法。func storeDatas() {    var name = "Jacky"    var age = 22    var gender = true    // 存入变量name,对应的键(key)为字符串“name”,下同。    defaults.setObject(name, forKey: "name")    defaults.setInteger(age, forKey: "age")    defaults.setBool(gender, forKey: "gender")}

默认保存数据的文件

2、读取

func getDatas() {    // 根据键(key),来获取相对应的值(value)。    var name = defaults.objectForKey("name") as? String    var age = defaults.integerForKey("age")    var gender = defaults.boolForKey("gender")    // 打印观察结果。    println("Name: \(name), Age: \(age), Gender: \(gender).")}

3、清空

所用方法: defaults.removePersistentDomainForName(domainName: String)
PS:下面文中,“三、存入指定的plist文件”——“3、清空”,也是用上面的方法。

// 方法封装func resetUserDefaultsDatas() {    // 得到app的Domain,即系统默认用于存入数据的文件名字(不含.plist后缀)。    var appDomain = NSBundle.mainBundle().bundleIdentifier    // 清空文件里面的所有数据(文件不删除)。    defaults.removePersistentDomainForName(appDomain!)}



三、存入指定的plist文件

1、存入

方法原型: defaults.setPersistentDomain(domain: [NSObject : AnyObject], forName: String)
参数1:字典数组;
参数2:存入目标文件的名字,文件后缀为plist。

// 定义一个domain的identifier。var personDomain = "person"// 定义一个字典。var dic = ["name": "Tom", "age": 24, "gender": true]defaults.setPersistentDomain(dic, forName: personDomain)

指定存入的plist文件

2、读取

函数原型: defaults.persistentDomainForName(domainName: String) -> [NSObject : AnyObject]?
接收:存入的文件名,不含.plist后缀;
返回:字典数组。

// 用变量dicFromPlist接收返回的字典数组。var dicFromPlist: Dictionary<NSObject, AnyObject> = defaults.persistentDomainForName(personDomain)!// 遍历打印观察结果。for (key, value) in dicFromPlist {    println("\(key): \(value)")}

3、清空

所用方法: defaults.removePersistentDomainForName(domainName: String)

// 清空文件里面的所有数据(文件不删除)。defaults.removePersistentDomainForName(appDomain!)



四、存入任意实现NSCoding协议的类(归档)

1、目标类需要实现的协议

协议原型:

protocol NSCoding {    func encodeWithCoder(aCoder: NSCoder)    init(coder aDecoder: NSCoder) // NS_DESIGNATED_INITIALIZER}

2、实现协议

class Person: NSObject, NSCoding{    // 自己定义的几个属性。    var name: String?    var age: Int?    var gender: Bool?    // 为了方便的构造方法。    init(name: String, age:Int, gender: Bool) {        self.name = name        self.age = age        self.gender = gender    }    // 必须加关键字required;    // 实例化时,默认调用的构造方法,不必人为调用。(必须)    required init(coder aDecoder: NSCoder) {        super.init()        self.name = aDecoder.decodeObjectForKey("name") as? String        self.age = aDecoder.decodeIntegerForKey("age")        self.gender = aDecoder.decodeBoolForKey("gender")    }    // 也是系统自动调用,不必人为调用。(必须)    func encodeWithCoder(aCoder: NSCoder) {        aCoder.encodeObject(name!, forKey: "name")        aCoder.encodeInteger(age!, forKey: "age")        aCoder.encodeBool(gender!, forKey: "gender")    }    // 不必重写;这里只是为了方便使用println(类引用)的时候,打印出数据。    override var description:String {        get{            return "Name: \(name!), Age: \(age!), Gender: \(gender!)"        }    }}

3、存入

方法原型: NSKeyedArchiver.archivedDataWithRootObject(rootObject: AnyObject) -> NSData

// 封装func storeByNSData() {    // 实例化实现了NSCoding的类。    var person1 = Person(name: "TomNSData", age: 23, gender: true)    // 转为NSData()(实现NSCoding的用处)。    var person1Data = NSKeyedArchiver.archivedDataWithRootObject(person1)    // 和一般的Object一样,使用下面的方法    defaults.setObject(person1Data, forKey: "person")}

4、读取

方法原型: NSKeyedUnarchiver.unarchiveObjectWithData(data: NSData) -> AnyObject?

func getNSData() {    // 和一般的Object一样,使用下面的方法    var person1DataFromPlist = defPlist.objectForKey("person") as? NSData    // 解码。    var person1FromPlist = NSKeyedUnarchiver.unarchiveObjectWithData(person1DataFromPlist!) as! Person    // 打印观察结果。    println(p1FromPlist)}

5、总结

存入任意类,和存入一般类

区别(任意类):
1、需要实现NSCoding协议;
2、用归档API转为NSData。

相同:
存入,读取的API一样。

1 0
原创粉丝点击