使用NSCoding保存自定义对象数组

时间:2015-12-07 06:40:29

标签: swift swift2 nscoding

我正在尝试制作一个闹钟应用,以了解如何使用保存自定义对象的数组。

我的项目设置包含一个自定义的“Alarm”对象,其中包含有关每个警报的所有信息,我创建了一个继承NSObject和NSCoding的类。

这是警报对象类

import Foundation

class Alarm : NSObject {
    var name : String
    var active : Bool
    var days : [String]
    var sound : [String:Int] //Will change later...... I think?.....
    var time : NSDate

    init(name : String, active : Bool, days : [String], sound : [String:Int], time : NSDate) {
        self.name = name
        self.active = active
        self.days = days
        self.sound = sound
        self.time = time
    }
}

继承我继承NSObject和NSCoding的自定义类

import UIKit

class Alarms: NSObject, NSCoding {
    var alarmList : [Alarm]

    init(alarmList : [Alarm]) {
        self.alarmList = alarmList
    }

    required convenience init?(coder decoder: NSCoder) {
        guard let alarmList = decoder.decodeObjectForKey("alarms") as? [Alarm]
            else { return nil }

        self.init(
            alarmList : alarmList
        )
   }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(alarmList, forKey: "alarms")
   }
}

我有一个连接到按钮的保存功能,用于测试目的。这是该功能。

func save(sender: AnyObject?) {
    //Save with NSKeyArchiver
    print("Save: \(path)")

    var success = false

    success = NSKeyedArchiver.archiveRootObject(alarmItems, toFile: path)

    if success {
        print("Saved Alarms")
    } else {
        print("Didn't Save Alarms")
    }

}

我引用了一个在我的ViewDidLoad()函数

中设置的路径变量
path = fileInDocumentsDirectory("alarms.plist")

现在,当我运行应用程序并添加警报并单击“保存”按钮时,它会崩溃,并显示以下错误

  

***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [SavingAlarmsApp.Alarm encodeWithCoder:]:无法识别的选择器发送到实例0x7fbe3ac789a0'

我在这里做错了什么?我已经能够使用此代码保存一个字符串数组。

1 个答案:

答案 0 :(得分:4)

你刚忘了警报课。它也应该实现NSCoding协议。