2017-10-31 14 views
0

UserDefaultsにユーザーの詳細を保存しようとしていますが、これはarchiver.encode(assistantContact,forKey: "assistantContact")でクラッシュします。 StructではなくAssistantContactをクラスとして作成しようとしましたが、まだ機能しませんでした。 AssistantContactもUserに保存するにはどうすればアーカイブできますか?UserDefaultsにデータを保存

struct AssistantContact { 
    var firstName: String 
    var lastName: String 
    var email: [String] 
} 

struct User { 
    var firstName: String 
    var lastName: String 
    var email: String 
    var phoneNumber: String 
    var company: String 
    var assistantContact: AssistantContact 
} 

extension User { 
    func encode() -> Data { 
     let data = NSMutableData() 
     let archiver = NSKeyedArchiver(forWritingWith: data) 
     archiver.encode(firstName, forKey: "firstName") 
     archiver.encode(lastName, forKey: "lastName") 
     archiver.encode(email, forKey: "email") 
     archiver.encode(phoneNumber, forKey: "phoneNumber") 
     archiver.encode(company, forKey: "company") 
     archiver.encode(assistantContact, forKey: "assistantContact") 
     archiver.finishEncoding() 
     return data as Data 
    } 

    init?(data: Data) { 
     let unarchiver = NSKeyedUnarchiver(forReadingWith: data) 
     defer { 
      unarchiver.finishDecoding() 
     } 
     guard let firstName = unarchiver.decodeObject(forKey: "firstName") as? String else { return nil } 
     guard let lastName = unarchiver.decodeObject(forKey: "lastName") as? String else { return nil } 
     guard let email = unarchiver.decodeObject(forKey: "email") as? String else { return nil } 
     guard let phoneNumber = unarchiver.decodeObject(forKey: "phoneNumber") as? String else { return nil } 
     guard let company = unarchiver.decodeObject(forKey: "company") as? String else { return nil } 
     guard let assistantContact = unarchiver.decodeObject(forKey: "assistantContact") as? AssistantContact else { return nil } 
     self.firstName = firstName 
     self.lastName = lastName 
     self.email = email 
     self.phoneNumber = phoneNumber 
     self.company = company 
     self.assistantContact = assistantContact 

    } 
} 
+0

のためにこれを使用し、それが与えるエラーは何ですか? –

+0

archiver.encode(assistantContact、forKey: "assistantContact")でクラッシュします。 – Nitesh

+0

@Niteshはあなたのアーカイブコードを表示し、 'User'構造体をどのように呼び出すのでしょうか? –

答えて

0

あなたはNSObjectに値を格納し、アーカイブデータのため、この方法を使用することができます。 archiver.archivedData(withRootObject: assistantContact)

archiver.encode(assistantContact, forKey: "assistantContact")を交換し、アーカイブしないunarchiver.unarchiveObject(with: assistantContact)

+0

私は構造体を使用しています。その付与エラー '静的メンバー' archivedData 'は使用できません。 – Nitesh

+0

@Niteshあなたは 'NSObject'にデータを保存することができます。これで問題は解決します。 –

+0

同じエラーです。 – Nitesh

関連する問題