ios - Swift 中的 NSCoding 没有正确归档数据?

标签 ios swift archive nscoding

总的来说,我对 iOS 开发还比较陌生,但我正在编写这个应用程序。

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

学期:

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

类(class):

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

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

最佳答案

我通常这样解码Int

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

翻译成你的问题会是这样的,改变你的Assignment类的init?(coder aDecoder: NSCoder)方法

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

}

希望对你有帮助

关于ios - Swift 中的 NSCoding 没有正确归档数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45890418/

相关文章:

iphone - ios自动调整容器大小

ios - Swift 将不同类型组合成一个数组来为 UITableView 显示数据

java - 在 .jar 存档中存储和提取文件的最佳方法是什么?

ios - 使用 xcode 中的表格 View 创建注册表单(如 SnapChat)

ios - 当 isMyLocationEnabled 设置为 true 时,GMSMapView 从哪里获取其位置数据?

c# - 尝试存档 Xamarin 应用程序以进行发布时找不到程序集 Mono.Android

ios - 如何自动将构建号添加到 Xcode ios 存档

objective-c - 更改 iAd 位置和展示位置

ios - 如何从通讯录 iOS 中检索手机号码

ios - 将数据移动到已启动应用程序中的共享组