Arrays 自定义类数组的NSCoder

Arrays 自定义类数组的NSCoder,arrays,swift,nsuserdefaults,nscoder,Arrays,Swift,Nsuserdefaults,Nscoder,我使用UserDefaults来存储数据,特别是一个类型为的数组。在健身班上有一系列的类型练习。当我调用save函数来保存数据时,编码练习数组时代码崩溃。我的设置有什么问题 enum Type: String { case Interval case Count } class Exercise: NSObject, NSCoding{ var reps: Int = 1 var numberOf: Int = 1 var name: String =

我使用UserDefaults来存储数据,特别是一个类型为的数组。在健身班上有一系列的类型练习。当我调用save函数来保存数据时,编码练习数组时代码崩溃。我的设置有什么问题

enum Type: String {
    case Interval
    case Count
}

class Exercise: NSObject, NSCoding{
    var reps: Int = 1
    var numberOf: Int = 1
    var name: String = "New Exercise"
    var type: Type = .Interval

    func encode(with aCoder: NSCoder) {
        aCoder.encode(name, forKey: "exerciseName")
        aCoder.encode(reps, forKey: "exerciseReps")
        aCoder.encode(type, forKey: "exerciseType")
        aCoder.encode(numberOf, forKey: "exerciseNumberOf")
    }

    required init(coder aDecoder: NSCoder) {
        name = aDecoder.decodeObject(forKey: "exerciseName") as! String
        reps = aDecoder.decodeObject(forKey: "exerciseReps") as! Int
        numberOf = aDecoder.decodeObject(forKey: "exerciseNumberOf") as! Int
        type = aDecoder.decodeObject(forKey: "exerciseType") as! Type

        super.init()
    }

    override init() {
        super.init()
    }

}

class Workout: NSObject, NSCoding {
    var name: String = "My Workout"
    var lastUsedDate: Date? = nil
    var exerciseList: [Exercise] = []


    func encode(with aCoder: NSCoder) {
        aCoder.encode(name, forKey: "name")
        aCoder.encode(lastUsedDate, forKey: "lastUsedDate")

        // Code crashes here:
        aCoder.encode(exerciseList, forKey: "exerciseData")

    }

    required init(coder aDecoder: NSCoder) {
        super.init()

        self.name = aDecoder.decodeObject(forKey: "name") as! String
        self.lastUsedDate = aDecoder.decodeObject(forKey: "lastUsedDate") as? Date
        self.exerciseList = aDecoder.decodeObject(forKey: "exerciseData") as! [Exercise]
    }

    override init() {
        super.init()
    }
}
保存和加载函数

func save() {
    let data = NSKeyedArchiver.archivedData(withRootObject: workouts )
    UserDefaults.standard.setValue(data, forKey: "data")

}

func load() {
    if let storedArray = UserDefaults.standard.object(forKey: "data") as? Data {
        workouts = NSKeyedUnarchiver.unarchiveObject(with: storedArray) as! [Workout]
    }
}

您的问题可能是这里的
enum Type
不符合NSCoding(请注意,您应该以小写字母开头命名案例。另一个问题是
decodeObject(forKey:“exerciseReps”)为!Int
您应该使用
decodeInteger(forKey:)
@LeoDabus是的,就是这样!谢谢