Arrays 自定义类数组的NSCoder
我使用UserDefaults来存储数据,特别是一个类型为的数组。在健身班上有一系列的类型练习。当我调用save函数来保存数据时,编码练习数组时代码崩溃。我的设置有什么问题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 =
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是的,就是这样!谢谢