單個對象歸檔,對使用nscoding,nskeyed..理解更深刻了
列子
- 在使用對對象數(shù)組歸檔解檔 要特別小心 iOS 下對于自定義的對象
要實(shí)現(xiàn)歸檔操作必須注意
只有使用nsdata作為中間者轉(zhuǎn)換具體思路
歸檔 customclass ->實(shí)現(xiàn)nscoding->NSKeyedArchiver.archivedDataWithRootObject一個實(shí)例到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
}
}//多個對象的存儲使用解檔歸檔 , 輕量級 存儲數(shù)據(jù)(的對象必須實(shí)現(xiàn)nscoding 兩個方法,實(shí)際上才能 把 你的對象轉(zhuǎn)成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類型直接歸檔,解檔需要將其取出構(gòu)造enum類型的,就是注意類型轉(zhuǎn)換的問題.當(dāng)然你也可以使用enum 類型不支持nscoding協(xié)議必須是nsobject對象的才能使用.不過在新的swift4中是可以支持codable協(xié)議