将数组保存到可重新加载的文件的最佳方法是什么?

时间:2017-01-04 15:56:58

标签: ios arrays swift storage

类似于游戏允许您保存进度的方式,我在iOS中有一个应用程序,用于在单个阵列中存储用户的进度。我想将该数组存储到一个文件中,以便当用户重新打开他们的应用程序时,此文件会加载其当前状态。

2 个答案:

答案 0 :(得分:2)

最简单的方法是使用NSKeyedArchiver / NSKeyedUnarchiver对,并确保数组中的每个对象都符合NSCoding。你可以阅读here

  NSKeyedArchiver.archiveRootObject(myArray, toFile: filePath)

然后取消归档

if let array = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? [Any] {
    objects = array
}

以下是符合NSCoding的示例对象(取自上面链接的文章):

class Person : NSObject, NSCoding {

    struct Keys {
        static let Name = "name"
        static let Age = "age"
    }

    var name = ""
    var age = 0

    init(dictionary: [String : AnyObject]) {
        name = dictionary[Keys.Name] as! String
        age = dictionary[Keys.Age] as! Int
    }

    public func encode(with archiver: NSCoder) {
        archiver.encodeObject(name, forKey: Keys.Name)
        archiver.encodeObject(age, forKey: Keys.Age)
    }

    required init(coder unarchiver: NSCoder) {
        super.init()
        name = unarchiver.decodeObjectForKey(Keys.Name) as! String
        age = unarchiver.decodeObjectForKey(Keys.Age) as! Int
    }
}

答案 1 :(得分:1)

如果数组中的对象都是"属性列表对象" (字典,数组,字符串,数字(整数和浮点数),日期,二进制数据和布尔值)然后您可以使用数组方法write(toFile:atomically:)将数组保存到文件,然后重新加载生成的文件arrayWithContentsOfFile:init(contentsOfFile:)

如果阵列中的对象object graph不是属性列表对象,那么这种方法不会起作用。在这种情况下,@ BogdanFarca建议使用NSKeyedArchiver / NSKeyedUnarchiver将是一个很好的方法。