使用 NSCoding Swift 保存对象时出现异常
Exception when saving object with NSCoding Swift
我在尝试使用 NSCoding save/archive 对象时遇到了一些问题。我基本上有一个定义问题和答案的 class QA,我还有一个 class Volume,它包含几个属性,包括 QA 对象数组。
错误发生在调用NSKeyedArchiver.archiveRootObject方法时。我怀疑它与 QA 对象数组有关,因为如果我注释掉那部分,则不会抛出异常。
My Volume class 继承自 NSObject 和 NSCoding,QA 对象仅继承自 NSObject。
The exception thrown is: ...encodeWithCoder:]: unrecognized selector
sent to instance 0x600000077c80
用于存档的方法是:
static func save() {
print("starting save...")
let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
let ArchiveURL = DocumentsDirectory.appendingPathComponent("volumesData")
NSKeyedArchiver.archiveRootObject(VolumeTableViewController.volumesArray, toFile: ArchiveURL.path)
print("Ending save...")
}
我的音量 class 是:
import Foundation
class Volume: NSObject, NSCoding {
let volumeNumber: Int
var completed: Bool
var questionsData: [QA]
init (volumeNumber: Int, completed: Bool, questionsData: [QA]) {
self.volumeNumber = volumeNumber
self.completed = completed
self.questionsData = questionsData
}
// MARK: NSCoding
public convenience required init?(coder aDecoder: NSCoder) {
let volumeNumber = aDecoder.decodeObject(forKey: "volumeNumber") as! Int
let completed = aDecoder.decodeObject(forKey: "completed") as! Bool
let questionsData = aDecoder.decodeObject(forKey: "questionsData") as! [QA]
self.init(volumeNumber: volumeNumber, completed: completed, questionsData: questionsData)
}
func encode(with aCoder: NSCoder) {
aCoder.encode(volumeNumber, forKey: "volumeNumber")
aCoder.encode(completed, forKey: "completed")
aCoder.encode(questionsData, forKey: "questionsData")
}
}
我的 QA class 是:
import Foundation
class QA: NSObject {
let questionsText: String
let answerText: [String]
let correctAnswer: [Bool]
var selectedAnswer: [Bool?]
// Create standard initiator
init(questionsText:String, answerText: [String], correctAnswer: [Bool], selectedAnswer: [Bool?]) {
self.questionsText = questionsText
self.answerText = answerText
self.correctAnswer = correctAnswer
self.selectedAnswer = selectedAnswer
}
}
有什么想法吗?
QA 也应该采纳 NSCoding.All 对象的自定义属性应该是可存档的,按照规则,对象的对象图中的每个对象也都符合 NSCoding。
为 Swift 4.
使用 Codable 协议
我在尝试使用 NSCoding save/archive 对象时遇到了一些问题。我基本上有一个定义问题和答案的 class QA,我还有一个 class Volume,它包含几个属性,包括 QA 对象数组。
错误发生在调用NSKeyedArchiver.archiveRootObject方法时。我怀疑它与 QA 对象数组有关,因为如果我注释掉那部分,则不会抛出异常。
My Volume class 继承自 NSObject 和 NSCoding,QA 对象仅继承自 NSObject。
The exception thrown is: ...encodeWithCoder:]: unrecognized selector sent to instance 0x600000077c80
用于存档的方法是:
static func save() {
print("starting save...")
let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
let ArchiveURL = DocumentsDirectory.appendingPathComponent("volumesData")
NSKeyedArchiver.archiveRootObject(VolumeTableViewController.volumesArray, toFile: ArchiveURL.path)
print("Ending save...")
}
我的音量 class 是:
import Foundation
class Volume: NSObject, NSCoding {
let volumeNumber: Int
var completed: Bool
var questionsData: [QA]
init (volumeNumber: Int, completed: Bool, questionsData: [QA]) {
self.volumeNumber = volumeNumber
self.completed = completed
self.questionsData = questionsData
}
// MARK: NSCoding
public convenience required init?(coder aDecoder: NSCoder) {
let volumeNumber = aDecoder.decodeObject(forKey: "volumeNumber") as! Int
let completed = aDecoder.decodeObject(forKey: "completed") as! Bool
let questionsData = aDecoder.decodeObject(forKey: "questionsData") as! [QA]
self.init(volumeNumber: volumeNumber, completed: completed, questionsData: questionsData)
}
func encode(with aCoder: NSCoder) {
aCoder.encode(volumeNumber, forKey: "volumeNumber")
aCoder.encode(completed, forKey: "completed")
aCoder.encode(questionsData, forKey: "questionsData")
}
}
我的 QA class 是:
import Foundation
class QA: NSObject {
let questionsText: String
let answerText: [String]
let correctAnswer: [Bool]
var selectedAnswer: [Bool?]
// Create standard initiator
init(questionsText:String, answerText: [String], correctAnswer: [Bool], selectedAnswer: [Bool?]) {
self.questionsText = questionsText
self.answerText = answerText
self.correctAnswer = correctAnswer
self.selectedAnswer = selectedAnswer
}
}
有什么想法吗?
QA 也应该采纳 NSCoding.All 对象的自定义属性应该是可存档的,按照规则,对象的对象图中的每个对象也都符合 NSCoding。
为 Swift 4.
使用 Codable 协议