对象已保存时如何向现有模型添加参数?
How to add parameters to existing model when objects already saved?
我有一个账单 class,其中包含一些账单实例,这些账单使用 NSKeyedArchiver 保存在 plist 文件中的文档目录中。
class Bill: NSObject, NSCoding {
required init?(coder aDecoder: NSCoder) {
name = aDecoder.decodeObject(forKey: "Name") as! String
moPayment = aDecoder.decodeDouble(forKey: "Payment")
super.init()
}
override init() {
super.init()
}
var name = "Bill Name"
var moPayment = 0.0
func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: "Name")
aCoder.encode(moPayment, forKey: "Payment")
}
}
func saveBillItems(_ bills: [Bill]) {
let data = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWith: data)
archiver.encode(bills, forKey: "BillItems")
archiver.finishEncoding()
data.write(to: dataFilePath(), atomically: true)
}
func loadBillItems() {
let path = dataFilePath()
if let data = try? Data(contentsOf: path) {
let unarchiver = NSKeyedUnarchiver(forReadingWith: data)
bills = unarchiver.decodeObject(forKey: "BillItems") as! [Bill]
unarchiver.finishDecoding()
}
}
所有这些都按预期工作,但现在我正在尝试添加一个额外的参数来记录 paidStatus。
class Bill: NSObject, NSCoding {
required init?(coder aDecoder: NSCoder) {
...
status = aDecoder.decodeObject(forKey: "Status") as! PaidStatus
super.init()
}
...
var status = PaidStatus.unpaid
enum PaidStatus {
case overdue
case upcoming
case unpaid
case paid
}
...
func encode(with aCoder: NSCoder) {
...
aCoder.encode(status, forKey: "Status")
}
}
func saveBillItems(_ bills: [Bill]) {
...
}
func loadBillItems() {
...
}
当我现在尝试 运行 应用程序时,出现错误:"Unexpectedly found nil..."
status = aDecoder.decodeObject(forKey: "Status") as! PaidStatus
由于尝试加载没有此参数的现有帐单对象。
有没有一种方法可以将此参数添加到我现有的对象中,而不必删除它们并从头开始重新创建它们?
由于您的对象可能没有值,因此您需要使用可选的向下转换,而不是强制向下转换。由于 status
不是可选的,您可以使用 nil 合并运算符来提供默认值
status = aDecoder.decodeObject(forKey: "Status") as? PaidStatus ?? .unpaid
我有一个账单 class,其中包含一些账单实例,这些账单使用 NSKeyedArchiver 保存在 plist 文件中的文档目录中。
class Bill: NSObject, NSCoding {
required init?(coder aDecoder: NSCoder) {
name = aDecoder.decodeObject(forKey: "Name") as! String
moPayment = aDecoder.decodeDouble(forKey: "Payment")
super.init()
}
override init() {
super.init()
}
var name = "Bill Name"
var moPayment = 0.0
func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: "Name")
aCoder.encode(moPayment, forKey: "Payment")
}
}
func saveBillItems(_ bills: [Bill]) {
let data = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWith: data)
archiver.encode(bills, forKey: "BillItems")
archiver.finishEncoding()
data.write(to: dataFilePath(), atomically: true)
}
func loadBillItems() {
let path = dataFilePath()
if let data = try? Data(contentsOf: path) {
let unarchiver = NSKeyedUnarchiver(forReadingWith: data)
bills = unarchiver.decodeObject(forKey: "BillItems") as! [Bill]
unarchiver.finishDecoding()
}
}
所有这些都按预期工作,但现在我正在尝试添加一个额外的参数来记录 paidStatus。
class Bill: NSObject, NSCoding {
required init?(coder aDecoder: NSCoder) {
...
status = aDecoder.decodeObject(forKey: "Status") as! PaidStatus
super.init()
}
...
var status = PaidStatus.unpaid
enum PaidStatus {
case overdue
case upcoming
case unpaid
case paid
}
...
func encode(with aCoder: NSCoder) {
...
aCoder.encode(status, forKey: "Status")
}
}
func saveBillItems(_ bills: [Bill]) {
...
}
func loadBillItems() {
...
}
当我现在尝试 运行 应用程序时,出现错误:"Unexpectedly found nil..."
status = aDecoder.decodeObject(forKey: "Status") as! PaidStatus
由于尝试加载没有此参数的现有帐单对象。
有没有一种方法可以将此参数添加到我现有的对象中,而不必删除它们并从头开始重新创建它们?
由于您的对象可能没有值,因此您需要使用可选的向下转换,而不是强制向下转换。由于 status
不是可选的,您可以使用 nil 合并运算符来提供默认值
status = aDecoder.decodeObject(forKey: "Status") as? PaidStatus ?? .unpaid