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