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

标签 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

最佳答案

我正在从下面我自己的项目中剪切和粘贴。我已将其限制为一个字符串参数以存储到文件中。但是你可以有更多不同的类型。您可以将其粘贴到单个 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)
    }
}

关于ios - SWIFT 如何创建一个 NSCoding 子类并从另一个类调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26086902/

相关文章:

ios - 将播放器 UIView 调整为全屏(从表头)

ios - 音轨的 ionic 框架

iphone - 我如何创建一个循环来检查每次迭代时是否有新的 IBAction 输入?

ios - 如何遍历字符串数组并在 Swift 中获取子字符串?

c# - Func<T> 的性能和继承

java - 构造函数中有很多参数

java - 遍历节点类被另一个类继承的树

swift - 如何快速获取本周星期一的日期

swift - swift 按时间顺序对月份数组进行排序

javascript - 为什么我在 iOS 模拟器中收到这个奇怪的错误?