Ios 使用NSCoding Swift保存对象时出现异常

Ios 使用NSCoding Swift保存对象时出现异常,ios,swift,xcode,nscoding,Ios,Swift,Xcode,Nscoding,尝试使用NSCoding保存/归档对象时遇到一些问题。我基本上有一个定义问答的类QA,我还有一个包含多个属性的类卷,包括一个QA对象数组 调用NSKeyedArchiver.archiveRootObject方法时发生错误。我怀疑这与QA对象数组有关,因为如果我注释掉该部分,则不会抛出异常 我的卷类继承自NSObject和NSCoding,QA对象仅继承自NSObject 引发的异常为:…encodeWithCoder::无法识别的选择器 已发送到实例0x600000077c80 用于存档的方法

尝试使用NSCoding保存/归档对象时遇到一些问题。我基本上有一个定义问答的类QA,我还有一个包含多个属性的类卷,包括一个QA对象数组

调用NSKeyedArchiver.archiveRootObject方法时发生错误。我怀疑这与QA对象数组有关,因为如果我注释掉该部分,则不会抛出异常

我的卷类继承自NSObject和NSCoding,QA对象仅继承自NSObject

引发的异常为:…encodeWithCoder::无法识别的选择器 已发送到实例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...")
}
我的课程是:

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")
    }
}
我的质量保证课程是:

 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。根据规则,对象的所有自定义属性都应该是可归档的。对象对象图中的每个对象也都符合NSCoding


对Swift 4使用可编码协议。

QA还应采用NSCoding。根据规则,对象的所有自定义属性都应是可归档的。对象对象图中的每个对象也符合NSCoding


对Swift 4使用可编码协议。

QA
也必须采用
NSCoding
QA
也必须采用
NSCoding