Swift 可选绑定不';拆开字典

Swift 可选绑定不';拆开字典,swift,dictionary,Swift,Dictionary,我有下面的字典 var menuItems: [[String: String?]] = [ ["name": "Home", "identifier": "homeController"], ["name": "Page 2", "identifier": "page2"], ["name": "Page 3", "identifier": "page3"]] 现在我使用下一个代码循环浏览字典 var names: [String] = [String]() for

我有下面的字典

var menuItems: [[String: String?]] = [
    ["name": "Home", "identifier": "homeController"],
    ["name": "Page 2", "identifier": "page2"],
    ["name": "Page 3", "identifier": "page3"]]
现在我使用下一个代码循环浏览字典

var names: [String] = [String]()
for item in menuItems
{
    if let name = item["name"]
    {
        names.append(name)
    }
}
如果让name=item[“name”]
应展开并将名称分配给
name
常量。分配工作,但不进行展开。

names.append(name)
抛出未展开的可选类型“String”的异常
值;你想用“!”吗或“?”?


为什么
项[“名称”]
没有展开?

项[“名称”]
没有展开。它被展开为
字符串?
。请记住,字典总是返回可选值(对于给定键不存在值的情况)

在您的情况下,值是另一个可选的字符串类型


如果您的字典声明为
[String:String]
(值类型为否
),则您不必使用
打开值

giorashc的回答是正确的,但我想我会发布这篇文章,因为它可能有助于理解原因

字典是用泛型参数
K
V
定义的

所以对于给定的字典
dict:[K:V]

dict[k]
的输出类型为
V?

在这种情况下,
K=String
V=String?


因此,下标访问结果的类型是
String??
。正如已经指出的,哪个被解包为
字符串?

下标是否还没有返回可选值?!因此,您将返回类似于
String???
的内容,而不是
String?
@DevAndArtist I。非常感谢。如果让value=item[“name”],name=value
,则可以使用
展开此文件。我不知道
item[“name”]
已展开,谢谢!