iOS Swift: save una matriz de classs personalizadas

Soy nuevo en progtwigción. Estoy haciendo un pequeño progtwig de database para iOS en forma rápida.

Tengo una class de persona:

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

Declaro una matriz de la class en la parte superior de mi controller de vista:

  var peopleArray = [Person]() 

Luego complete la matriz declarando algunos usuarios de muestra y anexándola a la matriz:

  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) 

Luego bash save los datos en un file de 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)") } 

El file Plist no se crea, silenciosamente no se crea y la function se completa como si lo hubiera hecho. ¿Alguna idea?

Los oscuros processs de compatibilidad de los types de datos rápidos y las estructuras de datos con las classs de cocoa son frustrantes para mí. Solo quiero save un file dañado. Tampoco puedo usar la function "añadir" si declaro mi matriz como una NSArray, ni puedo I + = un elemento en la matriz …

Actualización :

Agregué las siguientes funciones a mi class Persona:

 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 } 

Guardar el file ahora es:

 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)") } 

Se crea un file Plist con datos inescrutables.

Cierro la aplicación y la comienzo de nuevo, luego bash también cargar el file:

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

Y fracaso porque no puedo abatir "AnyObject no es idéntico a 'Person'. He intentado abatirlo de varias maneras y simplemente no puedo hacerlo con éxito. Esto es realmente frustrante.

En primer lugar, la causa raíz es [NSArray writeToFile:atomically:] solo admite ciertos types de datos. Puede consultar la documentation aquí .

Si imprime el código de retorno de cocoaArray.writeToFile(plistpath, atomically: true) , verá que está establecido en False .

Para superar esta restricción, debe

1) implementa una function de encoding en tu class Person

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

2) Convierta los elementos en su matriz en NSData , por ejemplo,

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

Al final, también necesitará una function de deencoding en la class Person para poder leerlos desde un file de plist

Después de agregar las siguientes funciones a su class Persona:

 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 } 

Debe usar 【NSKeyedArchiver】 y 【NSKeyedUnarchiver】 para almacenar y search la matriz.

Gracias @Anthony Kong .

Su respuesta es muy útil, pero creo que los siguientes códigos realmente pueden resolver el problema.

PARA ALMACENAR LA ARRAY EN PLIST

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

PARA FUMAR LA FORMA DE ARRAY PLIST

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