iOS Swift: enregistrer un tableau de classes personnalisées
Je suis nouveau en programmation. Je fais un petit programme de base de données pour iOS en swift.
J'ai une classe de personne:
class Person : NSObject {
var firstName : String
var lastName : String
init (firstName : String, lastName : String) {
self.firstName = firstName
self.lastName = lastName
}
}
Je déclare un tableau de la classe dans le haut de mon point de vue, contrôleur:
var peopleArray = [Person]()
Je puis remplir le tableau en déclarant quelques exemples d'utilisateurs et les ajouter au tableau:
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)
J'ai ensuite essayer d'enregistrer les données dans un fichier 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)")
}
Le fichier plist n'est pas créé, son silence ne parvient pas à créer et de la fonction complète que si elle avait. Toutes les pensées?
L'obscur de la compatibilité des processus de la swift types de données et structures de données avec le cacao en classes est frustrant pour moi. Je veux juste enregistrer une danged fichier. Je ne peux pas utiliser la fonction "append" si je déclare mon tableau comme un NSArray, je ne peux += un élément dans le tableau...
Mise à jour:
J'ai ajouté les fonctions suivantes de ma classe Personne:
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
}
De l'enregistrement du fichier est maintenant:
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)")
}
Un fichier Plist avec insondables de données est créé.
Je ferme l'application et commencer à nouveau, j'ai ensuite essayer de trop charger le fichier:
else { //Reading Plist file
println("\n\nPlist file found at \(plistpath)")
let cocoaArray = NSMutableArray.arrayWithContentsOfFile(plistpath)
peopleArray = cocoaArray as Array
}
}
Et j'échoue parce que je ne peux pas abattu "AnyObject n'est pas identique à "Personne". J'ai essayé de passer de plusieurs manières, et juste ne peut pas le faire avec succès. C'est vraiment frustrant.
source d'informationauteur Nate Birkholz | 2014-08-16
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, la cause est
[NSArray writeToFile:atomically:]
prend uniquement en charge certains types de données. Vous pouvez consulter la documentation ici.Si vous imprimez le code de retour de
cocoaArray.writeToFile(plistpath, atomically: true)
vous verrez qu'il est défini àFalse
.Pour contourner cette limitation, vous devez
1) mettre en œuvre un encoder fonction de votre
Person
classe2) Convertir les éléments de votre tableau dans
NSData
par exempleÀ la fin, vous aurez également besoin d'un décodage de la fonction dans le
Person
classe pour prendre en charge la lecture en arrière à partir d'un fichier plistFois que vous avez ajouté les fonctions suivantes à votre Personne de la classe:
Vous devez utiliser 【NSKeyedArchiver】 et 【NSKeyedUnarchiver】 pour stocker et récupérer le tableau.
Grâce @Anthony Kong.
Sa réponse aide beaucoup, mais je pense que les codes suivants peuvent vraiment résoudre le problème.
POUR STOCKER LE TABLEAU DANS PLIST
POUR EXTRAIRE LA MATRICE DE LA FORME PLIST