解开词典项目值

时间:2015-09-28 04:25:08

标签: ios swift

我有一个字典和打印字典键值如下:

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")

这与forlet方法有何不同,我是否需要在按键访问时显式解包项目值? e.g

println(student["name"]!)

Demo

2 个答案:

答案 0 :(得分:4)

当您通过密钥(dict[key])订阅来访问字典时,如果密钥不存在,则返回的值为nil。因此,student["name"]的结果类型为String?,以考虑nil的可能性,结果为Optional(...)

在另外两种情况下(forif let),控制结构会自动解包该值,因为不可能将值nil作为结果,因此item的类型为(String, String)而非(String, String?)name的类型为String

因此,如果直接使用student["name"],则应解包可选值以获取String(通过使用不同的解包运算符)。

答案 1 :(得分:1)

你字典肯定有" name"的值密钥,你知道,但编译器在它实际运行之前并不知道它并检查它。因此,当您执行println(student["name"])时,编译器不确定它是否具有值,因此认为它是可选的。

如果采用for-in循环方法,编译器首先会提取密钥,因此确保存在这些密钥。

if-let会自动展开该值,如果它不是,那么它就不是可选的。