2017-09-23 66 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協議。

相關問題