我在使用NSCodingSwift时遇到了麻烦.我试图实现协议,但每当我调用我的save()方法时我都会崩溃.Xcode让我上线了encodeWithCoder.这是我的代码,任何建议都会随之而来.
class CourseList: NSObject, NSCoding {
...
init(coder aDecoder: NSCoder!){
super.init()
if aDecoder != nil {
self.courses = aDecoder.decodeObjectForKey("courses") as Dictionary<String,course>
}
}
func encodeWithCoder(aCoder: NSCoder!) {
aCoder!.encodeObject(self.courses, forKey: "courses") // EXC_BAD_INSTRUCTOIN
}
}
Run Code Online (Sandbox Code Playgroud)
我写了save()并load()打电话给ViewController.
func save() {
var archivedObject = NSKeyedArchiver.archivedDataWithRootObject(History) //NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
var defaults = NSUserDefaults.standardUserDefaults() //[defaults setObject:archivedObject forKey:<key_for_archived_object>];
defaults.setObject(History.courses, forKey: "courses")
defaults.synchronize()
}
func load() {
var defaults = NSUserDefaults.standardUserDefaults() // NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
var archivedObject = defaults.objectForKey("courses") as NSData // NSData *archivedObject = [defaults objectForKey:<key_for_archived_object>];
History = NSKeyedUnarchiver.unarchiveObjectWithData(archivedObject) as Dictionary<String,course> //<your_class> *obj = (<your_class> *)[NSKeyedUnarchiver unarchiveObjectWithData:archivedObject];
}
Run Code Online (Sandbox Code Playgroud)
Jar*_*ger 37
自从提出这个问题以来,Swift已经发生了一些变化.我无法重现您所看到的错误,但我能够使用下面的代码使用Swift 1.0来使用NSCoding.
class CourseList: NSObject, NSCoding
{
var myCourses: Dictionary<String, String>?
override init() {}
required init(coder aDecoder: NSCoder) {
self.myCourses = aDecoder.decodeObjectForKey("myCourses") as? Dictionary
}
func encodeWithCoder(aCoder: NSCoder) {
if let courses = self.myCourses{
aCoder.encodeObject(courses, forKey: "myCourses")
}
}
func populateCourses() {
self.myCourses = ["cs101": "Hello World"]
}
func save() {
let data = NSKeyedArchiver.archivedDataWithRootObject(self)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "courseList")
}
func clear() {
NSUserDefaults.standardUserDefaults().removeObjectForKey("courseList")
}
class func loadSaved() -> CourseList? {
if let data = NSUserDefaults.standardUserDefaults().objectForKey("courseList") as? NSData {
return NSKeyedUnarchiver.unarchiveObjectWithData(data) as? CourseList
}
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
加载已保存的实例或根据需要创建新实例
// Try loading a saved version first
if let courseLs = CourseList.loadSaved() {
println("loaded Save CourseList")
} else {
// Create a new Course List
let courseLs: CourseList = CourseList()
courseLs.populateCourses()
courseLs.save()
}
Run Code Online (Sandbox Code Playgroud)
Ada*_*G J 15
class Student: NSObject, NSCoding {
var name: String!
var className: String!
var rollNo: Int!
var marks: [Float]!
// MARK: NSCoding
required convenience init(coder decoder: NSCoder) {
self.init()
self.name = decoder.decodeObjectForKey("name") as String?
self.className = decoder.decodeObjectForKey("className") as String?
self.rollNo = decoder.decodeIntegerForKey("rollNo")
self.marks = decoder.decodeObjectForKey("marks") as [Float]!
}
func encodeWithCoder(coder: NSCoder) {
coder.encodeObject(self.name, forKey: "name")
coder.encodeObject(self.className, forKey: "className")
coder.encodeInt(Int32(self.rollNo), forKey: "rollNo")
coder.encodeObject(self.marks, forKey: "marks")
}
}
Run Code Online (Sandbox Code Playgroud)
上面的类字符串,整数,数组编码实现.
假设学生是班级学生的一个实例
存档
文件系统 :
NSKeyedArchiver.archiveRootObject(student, toFile: "Here give your file path")
Run Code Online (Sandbox Code Playgroud)NSUserDefaults:
let data = NSKeyedArchiver.archivedDataWithRootObject(student)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "student")
Run Code Online (Sandbox Code Playgroud)解除封存
文件系统 :
NSKeyedUnarchiver.unarchiveObjectWithFile(student, toFile: "Here give your file path")
Run Code Online (Sandbox Code Playgroud)NSUserDefaults:
if let data = NSUserDefaults.standardUserDefaults().objectForKey("student") as? NSData {
let student = NSKeyedUnarchiver.unarchiveObjectWithData(data)
}
Run Code Online (Sandbox Code Playgroud)ADDIT:
保存/读取的文件路径
func saveFileLocation() -> String {
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
let documentDirectory = paths[0] as! String
return documentDirectory.stringByAppendingPathComponent("savefile")
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23122 次 |
| 最近记录: |