如何改变Swift词典词典

时间:2014-12-15 19:40:37

标签: swift dictionary nsdictionary

我有一个包含Dictionary的Swift词典,我想使用stored属性来访问键值:

  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
    }
  }

最后一行抛出一个编译错误:postfix'!'的操作数应该有可选的类型; type是'(NSObject,AnyObject)'

显然基于编译错误,编译器认为self.json [“category”]是无法转换为Dictionary的(NSObject,AnyObject)类型!

我认为这应该是常用用法?你会如何正常访问词典词典?

2 个答案:

答案 0 :(得分: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中固有的动态类型。

答案 1 :(得分:0)

这是一个元组。我们需要的是字典。

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
    }