如何改变 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]

如何将 JSON 转换为 Swift Dictionary 以进行 HTTP POST

Swift - 字典中的存储值顺序完全改变