2017-08-25 6 views
1

Je suis relativement nouveau dans le développement iOS en général, mais je suis en train de coder cette application.NSCoding dans Swift ne pas archiver correctement les données?

J'ai des objets personnalisés "Semestre", "Cours" et "Affectations". Les semestres contiennent des tableaux de cours et les cours contiennent des tableaux d'assignations. Je suis capable d'archiver correctement les informations du semestre et du cours, mais pour une raison quelconque, les informations d'affectation ne peuvent pas être lues.

Semestre:

required init?(coder aDecoder: NSCoder) { 
    self.name = "" 

    super.init() 

    if let archivedName = aDecoder.decodeObject(forKey: "name") as? String { 
     name = archivedName 
    } 
    if let archivedCourses = aDecoder.decodeObject(forKey: "courses") as? [Course] { 
     courses = archivedCourses 
    } 
} 

func encode(with aCoder: NSCoder) { 
    aCoder.encode(name, forKey: "name") 
    aCoder.encode(courses, forKey: "courses") 
} 

Cours:

required init?(coder aDecoder: NSCoder) { 
    self.name = "" 
    super.init() 

    if let archivedName = aDecoder.decodeObject(forKey: "courseName") as? String { 
     name = archivedName 
    } 
    if let archivedAssignments = aDecoder.decodeObject(forKey: "assignments") as? [Assignment] { 
     assignments = archivedAssignments 
    } 
} 

func encode(with aCoder: NSCoder) { 
    aCoder.encode(name, forKey: "courseName") 
    aCoder.encode(assignments, forKey: "assignments") 

Attribution:

required init?(coder aDecoder: NSCoder) { 
    self.name = "" 
    self.grade = 0 
    self.weight = 0 
    super.init() 

    if let archivedName = aDecoder.decodeObject(forKey: "assignmentName") as? String, let archivedGrade = aDecoder.decodeObject(forKey: "assignmentGrade") as? Int, let archivedWeight = aDecoder.decodeObject(forKey: "assignmentWeight") as? Int { 
     name = archivedName 
     grade = archivedGrade 
     weight = archivedWeight 
    } 
} 

func encode(with aCoder: NSCoder) { 
    aCoder.encode(name, forKey: "assignmentName") 
    aCoder.encode(grade, forKey: "assignmentGrade") 
    aCoder.encode(weight, forKey: "assignmentWeight") 
} 

Je ne sais pas pourquoi, mais les détails de l'affectation ne peuvent pas être lus lorsque je tente de décoder l'objet.

+0

decoderObject ont une méthode spéciale pour décoder Ints –

+0

Est-ce que ma réponse vous a aidé? tout commentaire est appréciable, merci –

+0

Oui, il l'a fait! Merci de votre aide!! –

Répondre

0

Je Habituellement décode Int comme ce

if decoder.containsValue(forKey: "teamNumber"){ 
    self.teamNumber = decoder.decodeInteger(forKey: "teamNumber") 
} 

traduit votre problème sera comme ça, changer la méthode init?(coder aDecoder: NSCoder) de votre Assignment classe

required init?(coder aDecoder: NSCoder) { 

    self.name = "" 
    self.grade = 0 
    self.weight = 0 
    super.init() 

    if let archivedName = aDecoder.decodeObject(forKey: "assignmentName") as? String{ 
     self.name = archivedName 
    } 

    if decoder.containsValue(forKey: "assignmentGrade"){ 
     self.grade = decoder.decodeInteger(forKey: "assignmentGrade") 
    } 

    if decoder.containsValue(forKey: "assignmentWeight"){ 
     self.weight = decoder.decodeInteger(forKey: "assignmentWeight") 
    } 

} 

Hope this helps