SWIFT如何创建NSCoding子类并从另一个类调用它?

时间:2014-09-28 16:16:10

标签: ios inheritance swift nscoding

我在NSCoding上发现了这个黑色代码,它几乎想要我想要它。我发现它的链接在下面。 如何在其他类中创建NSCoding类和用户?下面的代码不起作用。我希望有些人可以帮助我。

import Foundation
import UIKit


class User: NSObject, NSCoding {
    var name: String

    init(name: String) {
        self.name = name
    }

   required init(coder aDecoder: NSCoder) {

        self.name = aDecoder.decodeObjectForKey("name") as String
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(name, forKey: "name")
    }
}


//new class where I want to set and get the object

class MyNewClass: UIViewController {

    let user = User(name: "Mike")
    let encodedUser = NSKeyedArchiver.archivedDataWithRootObject(user)
    let decodedUser = NSKeyedUnarchiver.unarchiveObjectWithData(encodedUser) as User

}

//http://stackoverflow.com/questions/24589933/nskeyedunarchiver-fails-to-decode-a-custom-object-in-swift

1 个答案:

答案 0 :(得分:3)

我从下面的自己的项目切割和粘贴。我将此限制为一个字符串参数来存储到文件。但是你可以有更多不同的类型。您可以将其粘贴到单个swift文件中,并将其用作ViewController并添加要测试的类。它演示了使用NSCoding和swift语法来保存和检索对象中的数据。

import UIKit
import Foundation

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        var instanceData = Data()
        instanceData.name = "testName"
        ArchiveData().saveData(nameData: instanceData)
        let retrievedData = ArchiveData().retrieveData() as Data
        println(retrievedData.name)

    }
}

class Data: NSObject {

    var name: String = ""

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

    init(coder aDecoder: NSCoder!) {
        name = aDecoder.decodeObjectForKey("name") as String
    }

    override init() {
    }
}

class ArchiveData:NSObject {

    var documentDirectories:NSArray = []
    var documentDirectory:String = ""
    var path:String = ""

    func saveData(#nameData: Data) {
        documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
        documentDirectory = documentDirectories.objectAtIndex(0) as String
        path = documentDirectory.stringByAppendingPathComponent("data.archive")

        if NSKeyedArchiver.archiveRootObject(nameData, toFile: path) {
            //println("Success writing to file!")
        } else {
            println("Unable to write to file!")
        }
    }

    func retrieveData() -> NSObject {
        var dataToRetrieve = Data()
        documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
        documentDirectory = documentDirectories.objectAtIndex(0) as String
        path = documentDirectory.stringByAppendingPathComponent("data.archive")
        if let dataToRetrieve2 = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? Data {
            dataToRetrieve = dataToRetrieve2 as Data
        }
        return(dataToRetrieve)
    }
}
相关问题