我已经宣布了下面的字典
var locations:Dictionary= ["loc1":"Los Angeles","loc2":"San Francisco"];
然后试图简单地将它分配给一个variable
而不是一个constant
var location:String = locations["loc1"];
但随后编译器抱怨: Value of optional type 'String?' not unwrapped; did you mean to use '!' or '?'?
如果我更改var location:String = locations["loc1"];
为var location:String? = locations["loc1"];
,这意味着String是可选的,编译器错误就会消失.
但正如你所看到的,我没有将我的字典定义为可选的,例如Dictionary
.所以只是想知道为什么Swift将我的值类型转换为场景后面的可选字符串(String?)?
拉取字典值的代码不知道是否locations["loc1"]
会返回一个值 - 它也可以返回nil
.因此,它不能被赋予非可选项String
,因为这将保证String不是nil,但事实并非如此.
但是,如果您想要location
作为非可选String,您可以初始化它,然后使用if let
从字典中解包值:
var location : String = "Unknown" if let value = locations["loc1"] { location = value }
略微冗长,但保证location
包含值或"Unknown"
不能nil
.