2016-05-17 21 views
0

我想通過下面的方式存儲緩存中的數組。 但不知何故,我得到錯誤「意外發現零而展開的可選值Swift,意外地發現零,而解包一個可選的值(NSKeyedUnarchiver)

我的代碼下面

負荷緩存

func loadCachedContacts(){ 
    let loadNSCachedContacts = NSUserDefaults.standardUserDefaults().objectForKey(constants.defaultsKeys.VISITED_CONTACTS_KEY) as? NSData 
    if let genericsData = loadNSCachedContacts { 

     if let conArray = NSKeyedUnarchiver.unarchiveObjectWithData(genericsData) as? 
     [Generic] //**error comes here** 
     { 

     //if(conArray != nil){ 
     // if let testArray = conArray { 
      for generic in conArray { 
       print("\(generic.genericCode), Cached Storage") 
      } 
     } 
     //} 
    } 
} 

保存到緩存

func storeVisitedContact(generic: Generic) 
    { 
    let def = NSUserDefaults.standardUserDefaults() 
    var readArray : [Generic] = [] 
    // visitedContactsArr.append(generic) 


     if var testArray = def.objectForKey(constants.defaultsKeys.VISITED_CONTACTS_KEY) as? [Generic] { 
     // readArray = testArray! as! [Generic] 

     if testArray.count>=constants.defaultsKeys.VISITED_CONTACTS_COUNT 
     { 
      testArray.removeFirst() 
     } 
     else{ 
      testArray.append(generic) 
     } 
     readArray = testArray 
    } 
    else{ 
     readArray.append(generic) 
    } 


    let archivedObject = NSKeyedArchiver.archivedDataWithRootObject(readArray as [Generic]) 
    NSUserDefaults.standardUserDefaults().setObject(archivedObject, forKey: constants.defaultsKeys.VISITED_CONTACTS_KEY) 
    NSUserDefaults.standardUserDefaults().synchronize() 
} 

有人可以幫我解決一些問題嗎? 編輯與NSCoding協議

class Generic: NSObject, NSCoding 
{ 

var genericCode = String("") 
var genericName = String("") 
var genericType = String("") 
var genericImageUrl = String("") 
var genericPhone = String("") 
var orgName = String("") 

var const = Constants() 

override init() 
{ 

} 

//Parameterzed Constructor for the Generic 
init(genericCode: String , genericName: String , genericPhone: String, genericType: String, genericImageUrl : String) 
{ 
    self.genericCode = genericCode 
    self.genericName = genericName 
    self.genericType = genericType 
    self.genericImageUrl = genericImageUrl 
    self.genericPhone = genericPhone 

} 

required init(coder aDecoder: NSCoder) { 
    genericCode = aDecoder.decodeObjectForKey("genericCode") as! String 
    genericName = aDecoder.decodeObjectForKey("genericName") as! String 
    genericType = aDecoder.decodeObjectForKey("genericType") as! String 
    genericPhone = aDecoder.decodeObjectForKey("genericPhone") as! String 
    orgName = aDecoder.decodeObjectForKey("orgName") as! String 
} 

func encodeWithCoder(aCoder: NSCoder) { 
    aCoder.encodeObject(genericCode, forKey: "genericCode") 
    aCoder.encodeObject(genericName, forKey: "genericName") 
    aCoder.encodeObject(genericType, forKey: "genericType") 
    aCoder.encodeObject(genericPhone, forKey: "genericPhone") 
} 

} 
+0

錯誤發生在哪一行?另外,如果您發佈'Generic'的'NSCoding'協議實現,它可能會有所幫助。 –

+0

@ gabriel_101,在這行中有一個錯誤:if conArray = NSKeyedUnarchiver.unarchiveObjectWithData(genericsData)as? [Generic],....並編輯我的代碼 –

回答

3

看起來你是不是在func encodeWithCoder(aCoder: NSCoder)

編碼鍵「ORGNAME」任意值當init(coder aDecoder: NSCoder)運行時,它會嘗試對關鍵解碼值「 orgName「不存在,因爲它在encodeWithCoder(aCoder: NSCoder)中被省略。此密鑰的解碼將導致無法解開的零。

+0

這是一個趕上...你已經抓住了完美的地方...謝謝gabriel –

+0

沒問題:-)很高興我能幫上忙。 –

相關問題