我已宣布跟随字典
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?)?
答案 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可选,以防万一。