【问题标题】:How to mutate Swift Dictionary of Dictionary如何改变 Swift Dictionary of Dictionary
【发布时间】:2023-03-07 11:49:01
【问题描述】:

我有一个包含 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!

我认为这应该是一种常见的用法?平时怎么访问字典词典?

【问题讨论】:

    标签: swift dictionary nsdictionary


    【解决方案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
        }
    

    【讨论】:

    • 是的,编译器确实告诉我这是一个元组,我只是不明白为什么我不能将这两行合并为一行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多