您的位置:首页 > 移动开发 > Swift

Swift中的NSKeyedArchiver使用

2015-09-16 09:20 519 查看
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()

        }
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: