2016-05-17 16 views
0

以下のようにしてキャッシングで配列を保存します。 しかし、どういうわけか、私はエラーにキャッシュにキャッシュオプション値(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") 
      } 
     } 
     //} 
    } 
} 

保存から

ロード以下

マイコード "予想外にオプションの値をアンラップしながら、nilを見つけ" を取得しています

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? [一般]、....そして私のコードも編集しました –

答えて

3

あなたはinit(coder aDecoder: NSCoder)が実行されると、それは "キーの値を解読しようとしますfunc encodeWithCoder(aCoder: NSCoder)

にキー「ORGNAME」に任意​​の値を符号化されていないように見えますorg3 "は、encodeWithCoder(aCoder: NSCoder)で省略されているため存在しません。このキーをデコードすると、アンラップできないnilが返されます。

+0

これはキャッチです...あなたは完璧なスポットを見つけました...ありがとうgabriel –

+0

全く問題ありません:-)うれしいことに私は助けました。 –

関連する問題