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

一、配置

得到默认的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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值