【发布时间】:2019-07-23 04:54:57
【问题描述】:
我有一个字典数组,就像这样
var myArray: [Dictionary<String, Any>] = [Dictionary<String, Any>]()
我在课堂上的某个地方添加了值,如下所示:
var myDict = Dictionary<String, Any>()
myDict["Id"] = "someUniqueId"
myDict["v1"] = -42
self.myArray.append(myDict)
然后我尝试像这样更新这个字典中的v1:
self.myArray.first(where: { $0["Id"] == "someUniqueId" })?["v1"] = -56
但是,编译器告诉我:
不能通过下标赋值:函数调用返回不可变值
除了复制整个字典、将其从数组中删除并重新插入之外,我还有什么方法可以修改数组中的值?
更新 该字典不是强类型的,因为字典中的内容(类型和字段名)都由外部系统中的用户控制。例如。我们下载一些元数据,然后为这些动态数据渲染控件。
【问题讨论】:
-
任何时候你说任何警钟都应该响起。这个带有 Id 和 v1 的东西应该是一个结构,这应该是该结构的一个数组。
-
"可以在 EXTERNAL 系统中使用他们想要的任何数据类型定义他们想要的字典中的任何字段名" 您提供的调用站点是一个示例,还是存在
"Id"硬编码?跨度> -
甚至 Any 都可以使用某些包装类型(例如具有关联值的枚举)删除,以仅支持特定类型。
-
但是你会有一个支持的类型列表,你知道如何使用的类型。
-
@zaitsman “来自 c# 我仍然有点坚持集合是值类型。”如果将它们作为引用类型对它们有益,只需将它们包装在一个类中,就像 Joakim 在他的回答中显示的那样。
标签: swift