2017-09-23 88 views
-1

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

调用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") 
    } 
} 

而我的QA课程i s:

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

有什么想法?

+2

'QA'还必须采用'NSCoding' – vadian

回答

2

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

对Swift 4使用Codable协议。