【问题标题】:Dictionary containing Arrays containing Dictionaries?包含包含字典的数组的字典?
【发布时间】:2014-11-17 00:37:12
【问题描述】:

代码sn-ps:

这是来自一个名为Static的结构:

static var messages: Dictionary = [:]

这是在类函数中:

if Static.messages[sender] == nil{ //no message history, create array then append
    var messages: [NSMutableDictionary] = [message]
    Static.messages[sender] = messages
}
else{ //there is message history, so append
    (Static.messages[sender] as Array).append(message)
}

错误:

Immutable value of type 'Array<T>' only has mutating members named 'append'

我正在尝试制作一个对话词典,其中每个项目都是一个人。每个数组将是一个消息列表。消息是字典类型。知道为什么我会收到此消息吗?

【问题讨论】:

  • 什么是message?错误在哪一行?您能否发布足够的代码,以便我们将其粘贴在操场上以重现您的问题?
  • 消息是一本字典。错误在线(Static.messages[sender] as Array).append(message)。要重现错误,您将需要访问我的服务器以获取数据以及所有代码。
  • 只需抓取服务器生成的数据并将其硬编码到 Playground 文件中的变量中。你没有发布足够的细节让我帮助你。请发布更多信息,否则您的问题可能会被关闭。至于你为什么会收到这条消息,那只是因为你的语法错误。

标签: ios swift


【解决方案1】:

如果您对编译器了解您的字典包含的内容,您将不需要使这变得困难的演员表。根据您发布的内容,Static.messages 的实际类型需要类似于Dictionary&lt;NSObject, Array&lt;NSMutableDictionary&gt;&gt;

您当前的尝试将字典值转换为Array,然后尝试追加——这失败了,因为 Swift 将这种转换的结果视为不可变的。您需要做的是简单地使用可选链接:

// instead of:
(Static.messages[sender] as Array).append(message)

// use:
Static.messages[sender]?.append(message)

【讨论】:

  • 我可以添加 static var messages: Dictionary = [:] 是在一个名为 Static 的结构内。
  • 我看到了 - 有没有编译过,或者你被这个错误困住了?您需要在声明 Dictionary 实例时提供键和值类型 - 该行不会按原样工作。
  • 你可以这样声明:static var messages: [NSObject: [NSMutableDictionary]] = [:]
  • 自从我添加了第二个 sn-p 后,它还没有编译。但是,在我将声明更改为 static var messages: [NSObject: [NSMutableDictionary]] = [:] 后,它现在可以编译了。谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多