使用NSCoding保存数组

Ami*_*mit 10 nscoding data-persistence swift ios8

我有一个小应用程序,具有一些保存功能.我有一个名为:Closet的数据模型类:

class Department: NSObject, NSCoding {
   var deptName = ""
   var managerName = ""

   var Task: [Assignment]?   // <----- assignment class is in example 2

   func encodeWithCoder(aCoder: NSCoder) {

    aCoder.encodeObject(deptName, forKey: "deptName")
    aCoder.encodeObject(managerName, forKey: "mngName")
   // aCoder.encodeObject(Task, forKey: "taskArray")

}

  required init(coder aDecoder: NSCoder) {

     super.init()

    course = aDecoder.decodeObjectForKey("deptName") as! String
    instructor = aDecoder.decodeObjectForKey("mngName") as! String
   // Task = aDecoder.decodeObjectForKey("tasKArray") as? [Assignment]

}

override init() {
    super.init()
}

}
Run Code Online (Sandbox Code Playgroud)

因此,这是主控制器数据模型,在第一个View Controller中,用户可以点击"+"按钮添加部门名称和管理员名称.问题不在于保存这个,因为我使用NSKeyedArchive成功保存并在应用程序启动时将其加载回来.

问题:

我想在这个名为Assignment的数据模型部门添加一个赋值数组,它有一个title和一个notes变量.这是作业的数据模型:

Assignment.swift

class Assignment: NSObject, NSCoding {
     var title = ""
     var notes = ""

      func encodeWithCoder(aCoder: NSCoder) {

    // Methods
    aCoder.encodeObject(title, forKey: "Title")
    aCoder.encodeObject(notes, forKey: "notepad")

}

required init(coder aDecoder: NSCoder) {


// Methods
    title = aDecoder.decodeObjectForKey("Title") as! String
    notes = aDecoder.decodeObjectForKey("notepad") as! String

    super.init()
}

override init() {
    super.init()
}


 }
Run Code Online (Sandbox Code Playgroud)

所以我实际上想要实现的是一个应用程序,用户进入不同的部门,使用不同的经理名称,现在可以在我的应用程序中工作,但在部门内,用户可以单击"+"按钮添加作业标题和注释部分单击时可以编辑,我可以在之后处理.这些任务因部门而异.

我的大问题是实现这一功能.我似乎无法让这个工作.

我希望这个数组赋值属性成为Department类的一部分,因此每个单元格都可以有自己的待办事项列表.任何帮助肯定会帮助我很多.谢谢 :)

小智 15

您使用NSCoder正确,但大写有两个错误.第一个错误影响应用程序的功能,第二个错误是样式错误.您Task使用密钥编码"taskArray",但您尝试使用密钥对其进行解码"tasKArray".如果您在后者中修复大写字母K,那么您的代码将起作用.

第二个大写错误是一个风格错误:Task像Swift中的所有属性一样,应该用lowerCamelCase(llamaCase)编写.

一定要密切注意压痕.在编程中,我们遵循特殊的缩进规则,以帮助使代码清晰.以下是具有适当大小写和缩进的更正代码:

class Department: NSObject, NSCoding {
    var deptName = ""
    var managerName = ""

    var task: [Assignment]?

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(deptName, forKey: "deptName")
        aCoder.encodeObject(managerName, forKey: "mngName")
        aCoder.encodeObject(task, forKey: "taskArray")
    }

    required init(coder aDecoder: NSCoder) {
        super.init()

        course = aDecoder.decodeObjectForKey("deptName") as! String
        instructor = aDecoder.decodeObjectForKey("mngName") as! String
        task = aDecoder.decodeObjectForKey("taskArray") as? [Assignment]
    }

    override init() {
        super.init()
    }
}

class Assignment: NSObject, NSCoding {
    var title = ""
    var notes = ""

    func encodeWithCoder(aCoder: NSCoder) {
        // Methods
        aCoder.encodeObject(title, forKey: "Title")
        aCoder.encodeObject(notes, forKey: "notepad")
    }

    required init(coder aDecoder: NSCoder) {
        // Methods
        title = aDecoder.decodeObjectForKey("Title") as! String
        notes = aDecoder.decodeObjectForKey("notepad") as! String

        super.init()
    }

    override init() {
        super.init()
    }
}
Run Code Online (Sandbox Code Playgroud)