Swift中的NSKeyedArchiver使用

来源:互联网 发布:怎么举报网络赌钱 编辑:程序博客网 时间:2024/05/29 18:17
swift利用NSKeyedArchiver归档

Swift实现对象归档时有几个注意点

  • 要继承 NSCoding,实现两个方法

  • extension 是一个分类,分类不允许有存储能力,所以协议方法不能写在分类中

  • 协议中的init(coder decoder: NSCoder)函数会覆盖原始的构造函数,所以类中至少还要有另一个init方法

  • 如果不指定键名,会使用属性名称作为 key,基本数据类型,需要指定 key

class <#className#>: NSObject,NSCoding {
// 至少要有一个 init 方法,否则外部没有办法直接实例化对象
override init() {
}
// 归档方法
func encodeWithCoder(encoder: NSCoder) {
       // TODO   
}   
// 解档方法,会覆盖构造函数   
required init(coder decoder: NSCoder) {      
  // TODO   
}
}

//为什么会出现报错呢?
//init(coder decoder:NSCoder){}中解档没有写完.
import UIKit

class CellData: NSObject {
  
    //cell的标题
    var text:String =""
    //cell的勾选属性
    var isChecked:Bool

    //构造方法
     init(text:String,isChecked:Bool){
        self.text = text
        self.isChecked = isChecked
    }
    //勾选属性取反方法
    func chengedChecked(){
        self.isChecked = !isChecked
    }
    //编码成OBject
    func encodeWithCoder(aCoder:NSCoder!){
        aCoder.encodeObject(text,forKey:"text")
        aCoder.encodeObject(isChecked,forKey:"isChecked")
    }
    //NSObject解析回来
    required init(coder aDecoder:NSCoder!){
        self.text = aDecoder.decodeObjectForKey("text")as String
        self.isChecked = aDecoder.decodeObjectForKey("isChecked")as Bool
    }
}
——————————————存---------------------------
    //将数据保存到沙盒的方法
    func saveCheckListData(){
   
       
var data = NSMutableData()//创建一个可变的二进制数据
        //声明一个归档处理对象
        var archiver = NSKeyedArchiver(forWritingWithMutableData: data)
       
       
//arrayData按对应的CheckListData关键字进行编码
        archiver.encodeObject(arrayData, forKey: "CheckListData")
       
       
//结束编码
        archiver.finishEncoding()
       
//数据写入
        data.writeToFile(dataFilePath(), atomically: true)
    }
——————————————读--------------------
    //从沙盒中读取数据
    func loadCheckListData(){
   
       
//1.获取本地数据文件路径
        let path = self.dataFilePath()
       
//2.创建文件管理器
        let manager = NSFileManager()
       
//3.判断文件路径是否存在
        if manager.fileExistsAtPath(path){//存在
            //4.读取文件
            let data = NSData(contentsOfFile: path)
           
//5.创建解码器
            let unArchiver = NSKeyedUnarchiver(forReadingWithData: data!)
           
//6.通过归档时设置的关键字CheckListData来还原arrayData
            arrayData = unArchiver.decodeObjectForKey("CheckListData")as Array
           
//7.关闭解码器
            unArchiver.finishDecoding()
       
        }
else{//找不到本地文件
            //没找到创建新的
            saveCheckListData()
        }
    }
0 0