Swift 中的字典访问

Posted

技术标签:

【中文标题】Swift 中的字典访问【英文标题】:Dictionary access in Swift 【发布时间】:2014-07-11 19:26:20 【问题描述】:

考虑以下从 plist 中获取字典数组的代码:

let path = NSBundle.mainBundle().pathForResource("books", ofType: "plist")
let dict = NSDictionary(contentsOfFile: path)
let books:Array = dict.objectForKey("Books") as Array<Dictionary<String, AnyObject>> //I hate how ugly and specific this is. There has got to be a better way??? Why can't I just say let books:Array = dict.objectForKey("Books")?

let rnd = Int(arc4random_uniform((UInt32(books.count))))
let bookData:Dictionary = books[rnd]

现在,我无法访问个别图书词典:

let title:String = bookData.objectForKey("title") //[String: AnyObject] does not have a member named 'objectForKey'

let title:String = bookData["title"] // (String, AnyObject) is not convertible to String 

找到书名的正确方法是什么?

【问题讨论】:

你试过let bookData:Dictionary&lt;String,String&gt; = books[rnd]吗?然后你的第二个访问器应该工作。 (我不在电脑前测试) Swift version 【参考方案1】:

您可以将新的语法糖用于 Beta 3 中的数组和字典。

let path = NSBundle.mainBundle().pathForResource("books", ofType: "plist")
let dict = NSDictionary(contentsOfFile: path)
let books = dict.objectForKey("Books")! as [[String:AnyObject]]

您可以按原样访问bookData,自动类型推断应该可以工作...

let rnd = Int(arc4random_uniform((UInt32(books.count))))
let bookData = books[rnd]

为 book 字典中的每个项目设置一个显式类型,因为我们已将其定义为 AnyObject

let title = bookData["title"]! as String
let numPages = bookData["pages"]! as Int

后期编辑

使用 nil 合并运算符 ??,您可以检查 nil 值并提供替代值,如下所示:

let title = (bookData["title"] as? String) ?? "untitled"
let numPages = (bookData["pages"] as? Int) ?? -1

【讨论】:

我还是得到(String, AnyObject) is not convertible to String在线let title = bookData["title"]! as String 你看过“title”里面的内容了吗?它的值也是一个对象吗? 抱歉,错误消失了。 Beta3 对我来说仍然很麻烦。我会将此标记为正确。还有一个问题——为什么是“!”在 bookData["title"] 之后? 说可选肯定是有值的。我认为这叫做强制展开之类的。【参考方案2】:

斯威夫特:

如果使用Dictionary

if let bookData = bookData
   if let keyUnwrapped = bookData["title"]
      title = keyUnwrapped.string
   

【讨论】:

以上是关于Swift 中的字典访问的主要内容,如果未能解决你的问题,请参考以下文章

访问字典数组 Swift 3

swift:安全访问 SCNNode 数组的字典

如何在 Swift 中访问 [String: Any] 字典上的值

Swift 字典内的值访问和更改(涉及数组的字典)

如何在 Swift 中访问深度嵌套的字典

Swift Codable:具有字典的数组数组