我有一个小应用程序,具有一些保存功能。我有一个名为的数据模型类: Closet:
<html ng-app="root">
因此,这是主控制器数据模型,在第一个View Controller中,用户可以点击“+”按钮添加部门名称和经理名称。问题不在于保存,因为我使用NSKeyedArchive成功保存并在应用程序启动时将其加载回来。
问题:
我想在此数据模型部门上添加一个名为分配的分配数组,其中包含标题和注释变量。这是作业的数据模型:
Assignment.swift
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()
}
}
所以我实际上想要实现的是一个应用程序,用户进入不同的部门,使用不同的经理名称,现在可以在我的应用程序中工作,但在部门内,用户可以单击“+”按钮添加作业标题和备注部分,点击后可以编辑,我可以处理。这些任务因部门而异。
我的大问题是实现此功能。我似乎无法让这个工作。
我希望这个数组赋值属性成为Department Class的一部分,因此每个单元格都可以有自己的To-Do列表。任何帮助肯定会帮助我很多。谢谢:)
答案 0 :(得分:11)
您正确使用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()
}
}
答案 1 :(得分:0)
针对 Swift 5 / Xcode 版本 12.4 (12D4e) 进行了更新
感谢上面 Tone416 的示例——由于协议和方法发生了变化,我已经为 Swift 5 重新编写了它。我还提供了一个简单的测试来证明这一点,因此您应该能够将其剪切并粘贴到 Playground 中并运行它。
import Foundation
class Department: NSObject, NSCoding {
var deptName = ""
var managerName = ""
var task: [Assignment]?
func encode(with coder: NSCoder) {
coder.encode(deptName, forKey: "deptName")
coder.encode(managerName, forKey: "mngName")
coder.encode(task, forKey: "taskArray")
}
required init(coder aDecoder: NSCoder) {
super.init()
deptName = aDecoder.decodeObject(forKey: "deptName") as! String
managerName = aDecoder.decodeObject(forKey: "mngName") as! String
task = aDecoder.decodeObject(forKey: "taskArray") as? [Assignment]
}
override init() {
super.init()
}
convenience init(deptName: String, managerName: String, task: [Assignment]?) {
self.init()
self.deptName = deptName
self.managerName = managerName
self.task = task
}
}
class Assignment: NSObject, NSCoding {
var title = ""
var notes = ""
func encode(with coder: NSCoder) {
// Methods
coder.encode(title, forKey: "Title")
coder.encode(notes, forKey: "notepad")
}
required init(coder aDecoder: NSCoder) {
// Methods
title = aDecoder.decodeObject(forKey: "Title") as! String
notes = aDecoder.decodeObject(forKey: "notepad") as! String
super.init()
}
override init() {
super.init()
}
convenience init(title: String, notes: String) {
self.init()
self.title = title
self.notes = notes
}
}
// Create some data for testing
let assignment1 = Assignment(title: "title 1", notes: "notes 1")
let assignment2 = Assignment(title: "title 2", notes: "notes 2")
let myDepartment = Department(deptName: "My Dept", managerName: "My Manager", task: [assignment1, assignment2])
// Try archive and unarchive
do {
// Archive
let data = try NSKeyedArchiver.archivedData(withRootObject: myDepartment, requiringSecureCoding: false)
print ("Bytes in archive: \(data.count)")
// Unarchive
let obj = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as! Department
// Print the contents of the unarchived object
print("Department: \(obj.deptName) Manager: \(obj.managerName)")
if let task = obj.task {
for i in 0...task.count-1 {
print("Task: \(task[i].title) \(task[i].notes)")
}
}
} catch {
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
享受