当前位置: 首页 > 面试题库 >

将快速字典写入文件

昌正奇
2023-03-14
问题内容

快速将NSDictionaries写入文件有局限性。根据我从api文档中学到的知识和这个答案,键类型应该是NSString,值类型也应该是NSx类型,并且Int,String和其他swift类型可能不起作用。问题是,如果我有一个像这样的字典:Dictionary<Int,Dictionary<Int, MyOwnType>>如何快速将其写入plist文件或从plist文件读取?


问题答案:

无论如何,当您要存储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")
]

所以,这是您的问题:

将快速字典写入文件

您可以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`

但在您的问题中:

如何快速将其写入 plist 文件或从中读取?

实际上,NSKeyedArchiver
format是二进制plist。但是,如果你想要的字典 作为plist中的一个值
,你可以序列化Dicthtml" target="_blank">ionaryNSDataNSKeyedArchiver

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

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


 类似资料:
  • 我在做一个CSC 110项目。尽管我们还没有学过字典,我还是试着用字典来完成我们的作业。 我有一份国家和他们赢得多少奖牌的档案,用新的行字符隔开。例如: 虽然这是有效的,但它是肮脏和过于复杂。我正想出一个新方法来做这件事。

  • 问题内容: 我认为我应该完成一项我似乎无法解决的非常简单的任务。 如何将Python字典写入csv文件?我想要的只是将字典键写入文件的第一行,并将键值写入第二行。 我最接近的是以下内容(我是从别人的帖子中获得的): 问题是,上面的代码似乎只将密钥写入第一行,仅此而已。我没有将值写入第二行。 有任何想法吗? 问题答案: 您使用的是期望字典列表而不是字典的列表。您只想DictWriter.writer

  • 问题内容: 我正在努力将列表字典写入.csv文件。 这是我的字典的样子: 我希望.csv文件看起来像: 首先,我写标题: 到目前为止很好…但是,我的问题是我不知道如何将一个列表分配给相应的列。例如: 将随机填充列。另一个问题是,我必须手动填写键,并且不能将其用于具有4个键的另一本词典。 问题答案: 如果您不关心列的顺序(因为字典是无序的),则可以简单地使用: 结果: 如果您确实关心订单,则需要对键

  • 问题内容: 我正在尝试复制在目标C中执行的for循环,但遇到“’AnyObject’没有名为’GeneratorType’的成员错误: 这是我的雨燕 我试过为字典定义一个holder变量。任何人都可以看到我在做什么错吗? 问题答案: 这不是字典的循环。它循环通过存储在其中一个字典键中的数组。例如,如果您有一个字符串数组作为字典的键之一,这就是想要做的事情。 如果您确实想只遍历字典,这在Swift中

  • 问题内容: 这个问题已经在这里有了答案 : 水平写CSV (2个答案) 6年前关闭。 多亏了另一个线程,我才以Python初学者的身份成功地将字典写到了csv中:将字典写到 csv文件中,每个“键:值”一行] csv看起来像这样: 现在,我想知道用相同的键组织多个词典的最佳方法是什么。我希望将键作为第一列,然后在其后的各列中使用dict值,所有这些都具有第一行以按字典名称区分各列。 当然,有很多线

  • 问题内容: 我找到了一个解决方案,但确实很慢: 您有没有使用外部模块(numpy等)的任何想法? 问题答案: 由于字典很大,因此最好将所有涉及的项都保留为迭代器和生成器,像这样 样品运行: 输出量