關(guān)于swift下歸檔解檔遇到的坑

單個對象歸檔,對使用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é)議
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容