iOS Swift:保存一个自定义类的数组

我是编程新手。 我正在迅速为iOS做一个小数据库程序。

我有一个人课:

class Person : NSObject { var firstName : String var lastName : String init (firstName : String, lastName : String) { self.firstName = firstName self.lastName = lastName } } 

我在视图控制器的顶部声明了一个类的数组:

  var peopleArray = [Person]() 

然后我通过声明一些示例用户来填充数组,并将其附加到数组中:

  var nateB = Person(firstName: "Nate", lastName: "Birkholz") var nateC = Person(firstName: "Nate", lastName: "Carson") var nateD = Person(firstName: "Nate", lastName: "Donnelly") self.peopleArray.append(nateB) self.peopleArray.append(nateC) self.peopleArray.append(nateD) 

然后我尝试将数据保存到plist文件中:

  let fileManager = (NSFileManager.defaultManager()) let directorys : [String]? = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.AllDomainsMask, true) as? [String] if (directorys != nil){ let directories:[String] = directorys!; let pathToFile = directories[0]; //documents directory let plistfile = "PeopleArray.plist" let plistpath = pathToFile.stringByAppendingPathComponent(plistfile); if !fileManager.fileExistsAtPath(plistpath){ println("Declaring cocoaArray") var cocoaArray : NSArray = peopleArray cocoaArray.writeToFile(plistpath, atomically: true) println("I wrote an array to the file at\n\n\(plistpath)") } 

plist文件没有被创build,它默默无法创build,函数完成,就像它有。 有什么想法吗?

Swift数据types和数据结构与cocoa类的模糊兼容性过程令我感到沮丧。 我只想保存一个危险的文件。 我也不能使用“append”函数,如果我将我的数组声明为一个NSArray,也不能+ =一个项目数组…

更新

我将下面的函数添加到我的Person类中:

 func encodeWithCoder(aCoder: NSCoder!) { aCoder.encodeObject(firstName, forKey:"firstName") aCoder.encodeObject(lastName, forKey:"lastName") } init (coder aDecoder: NSCoder!) { self.firstName = aDecoder.decodeObjectForKey("firstName") as String self.lastName = aDecoder.decodeObjectForKey("lasName") as String } 

现在保存文件:

 let fileManager = (NSFileManager.defaultManager()) let directorys : [String]? = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.AllDomainsMask, true) as? [String] println("value of directorys is \(directorys)") if (directorys != nil){ let directories:[String] = directorys!; let pathToFile = directories[0]; //documents directory let plistfile = "PeopleArray.plist" let plistpath = pathToFile.stringByAppendingPathComponent(plistfile); if !fileManager.fileExistsAtPath(plistpath){ //writing Plist file self.createInitialPeople() println("Declaring cocoaArray") var cocoaArray : NSArray = [NSKeyedArchiver.archivedDataWithRootObject(peopleArray)] println("writing to path") cocoaArray.writeToFile(plistpath, atomically: true) let tellMe = cocoaArray.writeToFile(plistpath, atomically: true) println("Return of write is \(tellMe)") } 

带有难以理解的数据的Plist文件被创build。

我closures了应用程序,并重新启动,然后我尝试加载文件:

  else { //Reading Plist file println("\n\nPlist file found at \(plistpath)") let cocoaArray = NSMutableArray.arrayWithContentsOfFile(plistpath) peopleArray = cocoaArray as Array } } 

而且我失败了,因为我不能贬低“AnyObject与'Person'不一样,我试过了几个方面,但是不能成功,这实在令人沮丧。

首先,根本原因是[NSArray writeToFile:atomically:]只支持某些数据types。 你可以在这里查看文档。

如果从cocoaArray.writeToFile(plistpath, atomically: true)打印出返回码,则会看到它被设置为False

为了克服这个限制,你需要

1)在Person类中实现一个编码function

 func encodeWithCoder(aCoder: NSCoder!) { aCoder.encodeObject(firstName, forKey:"firstName") aCoder.encodeObject(lastName, forKey:"lastName") } 

2)将数组中的元素转换为NSData ,例如

  var cocoaArray : NSArray = [NSKeyedArchiver.archivedDataWithRootObject(nateB)] 

最后,您还需要在Person类中的解码函数来支持从plist文件中读取它们

在将以下函数添加到Person类之后:

 func encodeWithCoder(aCoder: NSCoder!) { aCoder.encodeObject(firstName, forKey:"firstName") aCoder.encodeObject(lastName, forKey:"lastName") } init (coder aDecoder: NSCoder!) { self.firstName = aDecoder.decodeObjectForKey("firstName") as String self.lastName = aDecoder.decodeObjectForKey("lasName") as String } 

您应该使用【NSKeyedArchiver】和【NSKeyedUnarchiver】来存储和读取数组。

谢谢@Anthony Kong

他的回答很有帮助,但是我认为下面的代码可以真正解决问题。

将arrays保存在图表中

 let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.AllDomainsMask, true) let path: AnyObject = paths[0] let arrPath = path.stringByAppendingString("/array.plist") NSKeyedArchiver.archiveRootObject(peopleArray, toFile: arrPath) 

取出arraysforms

 if let tempArr: [Person] = NSKeyedUnarchiver.unarchiveObjectWithFile(arrPath) as? [Person] { peopleArray = tempArr }