关于swift下归档解档遇到的坑

单个对象归档,对使用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协议
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容