我在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 }
灯泡时刻是您意识到可选词典不是词典的时候。可选的东西不是那个东西!这是一个可选的!仅此而已。可选本身是一种类型。Optional只是一个枚举,包装了可能的情况nil和一些值。包装的值是一个完全不同的对象,存储在内部。
因此,Optional的 任何事物 都不会像该事物的类型那样起作用。不是那件事!它只是可选的。解决问题的唯一方法是解开包装。
隐式解开的Optional也是如此;区别只是隐式展开的Optional愿意“自动”产生(暴露)包装的值。但实际上,它仍然被包裹着。而且,正如布赖恩·陈(Bryan Chen)所观察到的,它是一成不变的。Optional只是为您拿着它-并没有给您一个使用它的地方。