【问题标题】:Writing swift dictionary to file将快速字典写入文件
【发布时间】:2015-01-27 15:27:44
【问题描述】:

在 swift 中将 NSDictionaries 写入文件有一些限制。根据我从 api 文档和this stackoverflow answer 中了解到的,键类型应该是 NSString,值类型也应该是 NSx 类型,而 Int、String 和其他 swift 类型可能不起作用。 问题是,如果我有一本像:Dictionary<Int, Dictionary<Int, MyOwnType>> 这样的字典,我怎样才能在 swift 中向 plist 文件写入/读取它?

【问题讨论】:

    标签: swift dictionary nsdictionary plist


    【解决方案1】:

    无论如何,当你想将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 文件?

    事实上,NSKeyedArchiverformat is binary plist。但是,如果您希望该字典作为 plist 的值,您可以使用 NSKeyedArchiverDictionary 序列化为 NSData

    // archive to data
    let dat:NSData = NSKeyedArchiver.archivedDataWithRootObject(dict)
    
    // unarchive from data
    let dict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data) as [Int : [Int : MyOwnType]]
    

    【讨论】:

    • 非常感谢您详细而出色的回复。我是 swift 和 iOS 开发的新手,它也帮助我理解了相关的东西 :)
    • 这会将很多实体写入 plist
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2020-08-26
    • 2016-08-26
    相关资源
    最近更新 更多