gpt4 book ai didi

iOS swift : saving an array of custom classes

转载 作者:IT王子 更新时间:2023-10-29 05:23:15 25 4
gpt4 key购买 nike

我是编程新手。我正在快速为 iOS 制作一个小数据库程序。

我有一个人类:

class Person : NSObject {
var firstName : String
var lastName : String

init (firstName : String, lastName : String) {
self.firstName = firstName
self.lastName = lastName
}
}

我在 View Controller 的顶部声明了一个类数组:

    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 文件没有被创建,它默默地创建失败并且函数完成就像它已经完成一样。有什么想法吗?

swift 数据类型和数据结构与 cocoa 类的模糊兼容性过程让我感到沮丧。我只想保存一个危险的文件。如果我将我的数组声明为 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 文件。

我关闭应用程序并重新启动它,然后我也尝试加载文件:

         else {            //Reading Plist file
println("\n\nPlist file found at \(plistpath)")

let cocoaArray = NSMutableArray.arrayWithContentsOfFile(plistpath)

peopleArray = cocoaArray as Array
}
}

我失败了,因为我无法向下转换“AnyObject 与‘Person’不相同。我尝试过以多种方式向下转换它,但无法成功。这真的很令人沮丧。

最佳答案

将以下函数添加到 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

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

在 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)

获取数组形式的 PLIST

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

关于iOS swift : saving an array of custom classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25345076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com