Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS Swift:向下投射任何对象_Ios_Swift_Downcast - Fatal编程技术网

iOS Swift:向下投射任何对象

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.

我知道从Cocoa到Swift的问题都被问到了,还有一些bug,但我尝试了这里找到的很多方法,但我无法让它们发挥作用,希望有人能帮我一把

我是编程新手。我正在用swift为iOS制作一个数据库程序

我有个人课:

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