关于swift下归档解档遇到的坑
2016-12-14 本文已影响1053人
lotawei
单个对象归档,对使用nscoding,nskeyed..理解更深刻了
列子
- 在使用对对象数组归档解档 要特别小心 iOS 下对于自定义的对象
要实现归档操作必须注意
只有使用nsdata作为中间者转换具体思路
归档 customclass ->实现nscoding->NSKeyedArchiver.archivedDataWithRootObject一个实例到nsdata->归档这个nsdata
解档 过程相反NSKeyedUnarchiver.unarchive as nsdata->cutsom=NSKeyedUnarchiver.narchiveObjectWithData->终于拿到
WLPlayer
struct WlPlayerkey
{
static let playernamekey="name"
static let playerimagekey="displayimg"
static let playerpath="/players.data"
}
var name:String!
var displayimg:String! //得到沙盒路径存到缓存中 static func getfilepath()->String
{
let cachespath:String=NSSearchPathForDirectoriesInDomains( NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.UserDomainMask, true)[0]
let path:String= cachespath.stringByAppendingString(WlPlayerkey.playerpath)
return path
} //保存归档
static func saveplayertofile(newplayer:WLPlayer?) ->BooleanType
{
if (newplayer == nil)
{ return false
}
return NSKeyedArchiver.archiveRootObject(newplayer!, toFile:WLPlayer.getfilepath()) } //得到all玩家信息
static func getallplayers() ->WLPlayer
{
let data=NSKeyedUnarchiver.unarchiveObjectWithFile(WLPlayer.getfilepath()) as! WLPlayer
print( data.info())
return data
}
func info()->String
{ return "玩家"+self.name
}
required convenience init?(coder aDecoder: NSCoder)
{ let aname=aDecoder.decodeObjectForKey(WlPlayerkey.playernamekey) let imagepath=aDecoder.decodeObjectForKey(WlPlayerkey.playerimagekey)
self.init(name:aname as! String,displayimg:imagepath as! String)
}
func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(self.name,forKey: WlPlayerkey.playernamekey) aCoder.encodeObject(self.displayimg,forKey: WlPlayerkey.playerimagekey)
}
init?(name:String,displayimg:String)
{
super.init()
if name.characters.count>0
{
self.name=name
self.displayimg=displayimg
}
else
{
return nil
}
} //判断是否为一个玩家
func judgesameplayer(otherplayer:WLPlayer?)->Bool {
if (otherplayer != nil)
{
if otherplayer!.name==self.name
{
return true
}
return false
}
return false
}
}//多个对象的存储使用解档归档 , 轻量级 存储数据(的对象必须实现nscoding 两个方法,实际上才能 把 你的对象转成nsdata 类型的)
使用
let newp1=Person.init(name: "王nima", age: 13)
let newp2=Person.init(name: "王s", age: 13)
let newp3=Person.init(name: "雨豪", age: 13)
let newp4=Person.init(name: "王雨", age: 14)
let newp5=Person.init(name: "王", age: 16)
let newp6=Person.init(name: "妄图图", age: 13)
let allpersons=[newp1,newp2,newp3,newp4,newp5,newp6] allperson.addObject(newp1!) allperson.addObject(newp2!) allperson.addObject(newp3!) allperson.addObject(newp4!) allperson.addObject(newp5!) allperson.addObject(newp6!) print(getfinalpath())//
let data=NSKeyedArchiver.archivedDataWithRootObject(newp6!)//
// // NSUserDefaults.standardUserDefaults().setObject(data, forKey: "new6")// //
let getdata=NSUserDefaults.standardUserDefaults().objectForKey("new6") as! NSData// // //
let getnewperson=NSKeyedUnarchiver.unarchiveObjectWithData(getdata)// as! Person// // print(getnewperson.name)
let datas=NSKeyedArchiver.archivedDataWithRootObject(allperson) NSKeyedArchiver.archiveRootObject(datas, toFile: getfinalpath())
let getdatas=NSKeyedUnarchiver.unarchiveObjectWithFile(getfinalpath()) as! NSData
let somearry=NSKeyedUnarchiver.unarchiveObjectWithData(getdatas) as! NSMutableArray
var getpersons:[Person]?=[Person]()
for ids in somearry
{
if ids is Person
{
let a = ids as! Person
getpersons?.append(a)
print(a.name)
}
}
- swift归档中可能会遇到的小坑
针对enum类型的归档,需要在归档的时候需要使用rawvalue(type),不能直接使用enum类型直接归档,解档需要将其取出构造enum类型的,就是注意类型转换的问题.当然你也可以使用enum 类型不支持nscoding协议必须是nsobject对象的才能使用.不过在新的swift4中是可以支持codable协议