首页 > 解决方案 > 将 NSKeyedArchiver 与 Swift 数组一起使用

问题描述

我正在尝试使用 NSKeyedArchiver 保存一组数据。数据还包括一个快速的 Ints 数组。对于测试代码,我将一个简单的数据集转换为 Data,然后将其转换回来。请在下面查看我的代码。该代码有效,但我想知道是否有更好的方法来做到这一点。谢谢。

var str = "Hello, playground"
let numbers = [3,5,2,43]

let archiver = NSKeyedArchiver(requiringSecureCoding: true)
if let dataForNumbers = try? NSKeyedArchiver.archivedData(withRootObject: numbers, requiringSecureCoding: true ){
    archiver.encode( dataForNumbers, forKey: "numbers" )
    archiver.encode( str, forKey: "testString")

}
let data = archiver.encodedData

将数据转换回对象

if let unarchiver = try? NSKeyedUnarchiver.init(forReadingFrom: data ){
    let numberData = unarchiver.decodeObject(forKey: "numbers" )
    if let numbers = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(numberData as! Data) as? [Int] {
            print( numbers )
        }
    let testString = unarchiver.decodeObject(forKey: "testString") as? String
    print( testString )

}

谢谢礼萨

标签: swift

解决方案


是的,如果您询问文件大小和速度,您可以将字符串 utf8 数据保存到文本文件,将整数数组原始数据保存到二进制文件,如下所示:


let str = "Hello, playground"
let numbers = [3, 5, 2, 43]

if let textURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("str.txt"),
   let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("numbers.bin") {
    do {
        
        let strData = Data(str.utf8)
        try strData.write(to: textURL)

        let numbersData = numbers.withUnsafeBytes { Data($0) }
        try numbersData.write(to: fileURL)
        
        let stringFromData = try String(contentsOf: textURL)
        let loadedNumbersData = try Data(contentsOf: fileURL)
        
        let numbersFromLoadedData = loadedNumbersData.withUnsafeBytes { [Int]($0.bindMemory(to: Int.self))
        }
        
        print(stringFromData)
        print(numbersFromLoadedData)
    } catch {
        print(error)
    }
}

这将打印:

你好,游乐场
[3, 5, 2, 43]


推荐阅读