代码之家  ›  专栏  ›  技术社区  ›  laurie

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

  •  0
  • laurie  · 技术社区  · 8 年前

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

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

    引发的异常是:。。。编码器:无法识别的选择器 发送到实例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")
        }
    }
    

    我的QA课程是:

     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
        }
    } 
    

    1 回复  |  直到 8 年前
        1
  •  2
  •   Ellen    8 年前

    QA也应采用非编码。根据规则,对象的所有自定义属性都应该是可架构的,对象对象图中的每个对象也都符合NSCoding。