一尘不染

在Swift中为可选字典分配值

swift

我在Swift中使用可选字典发现了一些令人惊讶的行为。

var foo:Dictionary<String, String>?

if (foo == nil) {
    foo = ["bar": "baz"]
}
else {
    // Following line errors with "'Dictionary<String, String>?' does
    // not have a member named 'subscript'"
    foo["qux"] = "quux"
}

我已经做了很多事情,试图找出我可能会缺少的东西,但是除了使字典不是可选的以外,似乎没有什么能使此代码正常工作。我想念什么?

我能得到的最接近的是以下内容,但它当然是荒谬的。

var foo:Dictionary<String, String>?

if (foo == nil) {
    foo = ["bar": "baz"]
}
else if var foofoo = foo {
    foofoo["qux"] = "quux"
    foo = foofoo
}

阅读 216

收藏
2020-07-07

共1个答案

一尘不染

灯泡时刻是您意识到可选词典不是词典的时候。可选的东西不是那个东西!这是一个可选的!仅此而已。可选本身是一种类型。Optional只是一个枚举,包装了可能的情况nil和一些值。包装的值是一个完全不同的对象,存储在内部。

因此,Optional的 任何事物 都不会像该事物的类型那样起作用。不是那件事!它只是可选的。解决问题的唯一方法是解开包装。

隐式解开的Optional也是如此;区别只是隐式展开的Optional愿意“自动”产生(暴露)包装的值。但实际上,它仍然被包裹着。而且,正如布赖恩·陈(Bryan
Chen)所观察到的,它是一成不变的。Optional只是为您拿着它-并没有给您一个使用它的地方。

2020-07-07