一、配置
得到默认的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)
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一样。