将swift词典写入文件

时间:2014-11-29 00:39:35

标签: swift dictionary nsdictionary plist

在swift中将NSDictionaries写入文件存在限制。基于我从api docs和this stackoverflow answer学到的知识,键类型应该是NSString,值类型也应该是NSx类型,Int,String和其他swift类型可能不起作用。 问题是,如果我有一个字典,如:Dictionary<Int, Dictionary<Int, MyOwnType>>,我如何在swift的plist文件中写入/读取它?

1 个答案:

答案 0 :(得分:25)

无论如何,当您想将MyOwnType存储到文件时,MyOwnType必须是NSObject的子类并且符合NSCoding协议。像这样:

class MyOwnType: NSObject, NSCoding {

    var name: String

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

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

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

然后,这是Dictionary

var dict = [Int : [Int : MyOwnType]]()
dict[1] = [
    1: MyOwnType(name: "foobar"),
    2: MyOwnType(name: "bazqux")
]

所以,这是你的问题:

  

将swift词典写入文件

您可以使用NSKeyedArchiver进行撰写,并使用NSKeyedUnarchiver进行阅读:

func getFileURL(fileName: String) -> NSURL {
    let manager = NSFileManager.defaultManager()
    let dirURL = manager.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false, error: nil)
    return dirURL!.URLByAppendingPathComponent(fileName)
}

let filePath = getFileURL("data.dat").path!

// write to file
NSKeyedArchiver.archiveRootObject(dict, toFile: filePath)

// read from file
let dict2 = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as [Int : [Int : MyOwnType]]

// here `dict2` is a copy of `dict`

但在你的问题正文中:

  

如何在swift中向 plist 文件写/读它?

事实上,NSKeyedArchiver format is binary plist。但是,如果您希望字典作为plist的值,则可以使用DictionaryNSData序列化为NSKeyedArchiver

// archive to data
let dat:NSData = NSKeyedArchiver.archivedDataWithRootObject(dict)

// unarchive from data
let dict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data) as [Int : [Int : MyOwnType]]