我有一个字典和打印字典键值如下:
var student = ["name": "Alan Turing",
"age": "23",
"gender": "Male"
]
println(student["name"])
for item in student{
println("Student: \(item.0) = \(item.1)" )
}
if let name = student["name"]{
println(name)
}
输出如下:
Optional("Alan Turing")
Student: gender = Male
Student: age = 23
Student: name = Alan Turing
Alan Turing
我想知道为什么会为这行代码打印可选值
println(student["name"]) ==> Optional("Alan Turing")
这与for
和let
方法有何不同,我是否需要在按键访问时显式解包项目值? e.g
println(student["name"]!)
答案 0 :(得分:4)
当您通过密钥(dict[key]
)订阅来访问字典时,如果密钥不存在,则返回的值为nil
。因此,student["name"]
的结果类型为String?
,以考虑nil
的可能性,结果为Optional(...)
。
在另外两种情况下(for
和if let
),控制结构会自动解包该值,因为不可能将值nil
作为结果,因此item
的类型为(String, String)
而非(String, String?)
,name
的类型为String
。
因此,如果直接使用student["name"]
,则应解包可选值以获取String
(通过使用不同的解包运算符)。
答案 1 :(得分:1)
你字典肯定有" name"的值密钥,你知道,但编译器在它实际运行之前并不知道它并检查它。因此,当您执行println(student["name"])
时,编译器不确定它是否具有值,因此认为它是可选的。
如果采用for-in
循环方法,编译器首先会提取密钥,因此确保存在这些密钥。
if-let
会自动展开该值,如果它不是,那么它就不是可选的。