Swift中的NSCoding没有正确存档数据?

时间:2017-08-25 23:07:14

标签: ios swift archive nscoding

我对iOS开发一般都比较新,但我正在编写这个应用程序。

我有自定义对象“学期”,“课程”和“作业”。学期包含课程数组,课程包含作业数组。我能够正确存档学期和课程信息,但由于某种原因,无法读取作业信息。

学期:

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")
}

课程:

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")

分配:

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")
}

我不确定为什么,但是当我尝试解码对象时无法读取分配细节。

1 个答案:

答案 0 :(得分:0)

我通常像这样解码if decoder.containsValue(forKey: "teamNumber"){ self.teamNumber = decoder.decodeInteger(forKey: "teamNumber") }

init?(coder aDecoder: NSCoder)

翻译成您的问题就是这样,更改Assignment类的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") } } 方法

Context

希望这有帮助