如何改变 Swift Dictionary of Dictionary
Posted
技术标签:
【中文标题】如何改变 Swift Dictionary of Dictionary【英文标题】:How to mutate Swift Dictionary of Dictionary 【发布时间】:2014-12-15 19:40:37 【问题描述】:我有一个包含 Dictionary 的 Swift Dictionary,我想使用存储属性来访问键值:
var json = [NSObject:AnyObject]()
var title: String
get
return (self.json["category"]! as [NSObject: AnyObject])["title"] as String
set
// var dict = (self.json["category"]! as [NSObject: AnyObject])
// dict["title"] = newValue
(self.json["category"]! as [NSObject: AnyObject])["title"] = newValue
最后一行抛出编译错误:Operand of postfix '!'应该有可选类型;类型是'(NSObject, AnyObject)'
显然基于编译错误,编译器认为 self.json["category"] 是 (NSObject, AnyObject) 的类型,不能转换为 Dictionary!
我认为这应该是一种常见的用法?平时怎么访问字典词典?
【问题讨论】:
【参考方案1】:我承认我仍然不了解这里的工作机制,但我确实看到了模式:Swift 不喜欢从 AnyObject
向下转换为可变类型的对象。向下转换为不可变类型更加宽容,这就是为什么您会注意到上面的不对称性:您的 getter 可以,但您的 setter 不行。
我不知道你所有的限制是什么,但看起来更可靠的方法是使用NSMutableDictionary
,它可以让你随心所欲:
class UsingNSMutableDictionary
var json = NSMutableDictionary()
var title: String
get
return self.json["category"]!["title"] as String
set
(self.json["category"] as NSMutableDictionary)["title"] = newValue
在 Swift 中处理 JSON 已经引发了很多讨论和不止几个库。如果您正在寻找实际可行的解决方案来使用 JSON,我建议您尝试其中一个库——它们倾向于采用更强大的方法来处理 Swift 处理 JSON 中固有的动态类型。
【讨论】:
原生 swift 字典是值类型,而 nsdictionary 是引用类型。这就是我选择使用哪一个的方式。话虽如此,我确实同意你的观点,我似乎在原生 swift 集合类型方面遇到了更多麻烦。顺便说一句,我认为您的 UsingSwiftNative 设置器也不起作用。 你是对的!对于那个很抱歉。无论如何,我都会拉它,因为它似乎是多余的。【参考方案2】:这是一个元组。我们需要的是一本字典。
set
// var dict = (self.json["category"]! as [NSObject: AnyObject])
// dict["title"] = newValue
// self.json["category"] = dict
var category: [NSObject: AnyObject] = self.json["category"] as [NSObject: AnyObject]
category["title"] = newValue
【讨论】:
是的,编译器确实告诉我这是一个元组,我只是不明白为什么我不能将这两行合并为一行。以上是关于如何改变 Swift Dictionary of Dictionary的主要内容,如果未能解决你的问题,请参考以下文章
如何使用swift在字典中添加多个参数[String,Dictionary]?
如何在 Swift 中维护 Dictionary 中数据的顺序?
如何将 swift Dictionary 转换为 NSDictionary
如何在 Swift 中检索 NSURLRequest 的 HTTPBody 参数到 Dictionary: [NSObject: AnyObject]