无法提取Dictionary <hashable,string> </hashable,string>的字符串值

时间:2014-06-03 22:15:15

标签: swift dictionary

我已宣布跟随字典

var locations:Dictionary<String,String> = ["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<String,String?>。所以只是想知道为什么Swift将我的值类型转换为场景后面的可选字符串(String?)?

2 个答案:

答案 0 :(得分:5)

提取字典值的代码不知道locations["loc1"]是否会返回值 - 它也可以返回nil。因此,它不能分配给非可选的String,因为这将保证String不是nil,但事实并非如此。

但是,如果您希望location作为非可选字符串,则可以对其进行初始化,然后使用if let从字典中解包该值:

var location : String = "Unknown"
if let value = locations["loc1"] {
     location = value
}

略微冗长,但保证location包含值或"Unknown"且不能为nil

答案 1 :(得分:1)

这是因为你的字典可能不包含该键的值,所以它返回一个String可选,以防万一。