【发布时间】:2021-05-27 07:05:08
【问题描述】:
这是我正在尝试做的,但简化了:
var adictionary = [String:[String]]()
adictionary["A"] = ["B", "C"]
adictionary["B"] = ["A", "C"]
adictionary["C"] = ["A"]
adictionary["D"] = []
var newdic = Array(adictionary.keys).reduce(into: [String: Bool]()) { $0[$1] = false } //I make an arr from a dictionary's keys of type [String:[String]]
for (key, val) in newdic{
for arr in adictionary[key]{
if !(adictionary[arr].contains(key)){
newdic[key] = true
}
}
}
当我运行上面试图在 ios 应用程序中运行的代码的简化版本时,出现这些错误:
main.swift:12:28: 错误:可选类型 '[String]?' 的值必须解包为“[String]”类型的值 for arr in dictionary[key]{
main.swift:12:28:注意:使用 '??' 合并当可选值包含“nil”时提供默认值 for arr in dictionary[key]{
main.swift:12:28: 注意:使用 '!' 强制解包如果可选值包含“nil”,则中止执行 for arr in dictionary[key]{
我不明白,我在做什么有什么问题?这些错误是什么意思?似乎 Swift 认为我在某个地方有一个可选的?但我不知道我是怎么做的......非常感谢任何帮助。
如果我改变这一行:for arr in dictionary[key]{
To: for arr in dictionary[key]!{
它修复了问题,新的错误出现在 if !(a... 行。我仍然不明白为什么会修复它。
【问题讨论】:
-
adictionary[key]始终是可选的。这就是字典的工作原理。 -
正如马特所说,你“知道有一个与
key关联的值,因为你首先从字典的键中获得了key,但 Swift 并不“知道” . 访问字典总是返回一个可选的, 因为可能有也可能没有与给定键关联的值. 强制展开使问题消失, 但 nil 与?? []合并是一种更安全的方法. 你没有说你的代码实际上是试图实现的,但是Set可能是一个更好的数据结构使用。Ben 如果你不需要预加载false;你的字典可以包含true/@ 987654329@
标签: ios swift for-in-loop