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

Posted

技术标签:

【中文标题】使用 NSCoding Swift 保存对象时出现异常【英文标题】:Exception when saving object with NSCoding Swift 【发布时间】:2017-09-23 18:14:35 【问题描述】:

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

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

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

抛出的异常是:...encodeWithCoder:]: unrecognized selector 发送到实例 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
    
 

有什么想法吗?

【问题讨论】:

QA也必须采用NSCoding 【参考方案1】:

QA 也应该采用 NSCoding。对象的所有自定义属性都应该按照规则归档,对象的对象图中的每个对象也都符合 NSCoding。

为 Swift 4 使用 Codable 协议。

【讨论】:

以上是关于使用 NSCoding Swift 保存对象时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

Swift,NSCoding 保存类的数组不起作用

将文本从 UITextView 保存到领域(Swift 5)时出现问题

将复选标记保存到 tableView Swift 时出现问题

如何在 Swift 的 NSCoding 初始化中返回预先存在的核心数据对象?

如何让我的简单对象符合 Swift 中的 NSManagedObject 和 NSCoding

使用 NSCoding 保存 TableView 单元格的重新排序