iOS Swift:向下投射任何对象
我知道从Cocoa到Swift的问题都被问到了,还有一些bug,但我尝试了这里找到的很多方法,但我无法让它们发挥作用,希望有人能帮我一把 我是编程新手。我正在用swift为iOS制作一个数据库程序 我有个人课:iOS Swift:向下投射任何对象,ios,swift,downcast,Ios,Swift,Downcast,我知道从Cocoa到Swift的问题都被问到了,还有一些bug,但我尝试了这里找到的很多方法,但我无法让它们发挥作用,希望有人能帮我一把 我是编程新手。我正在用swift为iOS制作一个数据库程序 我有个人课: class Person : NSObject { var firstName : String var lastName : String init (firstName : String, lastName : String) { self.
class Person : NSObject {
var firstName : String
var lastName : String
init (firstName : String, lastName : String) {
self.firstName = firstName
self.lastName = lastName
}
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
}
}
我在视图控制器顶部声明一个类数组:
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]
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 {
println("\n\nPlist file found at \(plistpath)")
let cocoaArray = NSMutableArray.arrayWithContentsOfFile(plistpath)
peopleArray = cocoaArray as Array
}
}
我失败了,因为我无法对“任何对象与“Person”都不相同”进行向下转换。我尝试了在StackOverflow上列出的几种方式对其进行向下转换,但无法成功地进行。这确实令人沮丧
更新为最终代码:
func createPeoplePlist() {
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"
plistpath = pathToFile.stringByAppendingPathComponent(plistfile);
if !fileManager.fileExistsAtPath(plistpath){ //writing Plist file
self.createInitialPeople()
println("Saving to Plist")
[NSKeyedArchiver.archiveRootObject(peopleArray, toFile: plistpath)]
println("writing to path \(plistpath)")
} else { //Reading Plist file
println("\n\nPlist file found at \(plistpath)")
peopleArray = NSKeyedUnarchiver.unarchiveObjectWithFile(plistpath) as [Person]
}
}
}
当您读回阵列时,阵列仍然包含
NSData
(您在第一次存档时创建的数据)。但是,我会问,为什么在写入磁盘之前还要将数据放入另一个数组中。peopleArray
本身可以是根对象;不需要额外的数组来包装它。然后,您可以简单地使用archiveRootObject(\uquo:toFile:)
和unarchiveObjectWithFile(\uquo:)
我还建议阅读and和文档,以了解更多信息。这有什么不同?虽然这是一个写得很好的问题,但似乎基本上是一样的。@jtbandes另一个问题是关于文件没有保存。它现在保存了,但数据无法读回。回答该问题的人建议我作为k针对我遇到的新问题提出一个新问题。我现在不准备写一个完整的答案,但是当你读回你的数组时,它仍然包含
NSData
。然而,我想问你为什么在写入磁盘之前还要将数据放入另一个数组。这里有一个不必要的层。你应该简单地编写归档数据目录首先读取一个文件,然后以同样的方式读取该文件并取消归档。事实上,您应该读取and。即,peopleArray
本身可以是根对象。不需要额外的数组包装它。然后您可以简单地使用archiveRootObject(quot:toFile:)
和unarchiveObjectWithFile(quot:)
。