Swift中的Optionals,为什么这个简单的代码不打印可选?

时间:2015-02-23 09:36:00

标签: ios swift optional swift-playground

var shoppingList = ["item1": "bread", "item2": "milk" ]

if let oldItem = shoppingList.updateValue("honey", forKey: "item2") {
    println("old value was \(oldItem)")
}

// This prints out "old value was milk"

但是,如果我这样做

var shoppingList = ["item1": "bread", "item2": "milk" ]

let oldItem = shoppingList.updateValue("honey", forKey: "item2")
println("old value was \(oldItem)")
// This would print out "old value was Optional("milk")

if oldItem != nil {
   println("old value was \(oldItem)")
}

// And this prints out the same "old value was Optional("milk")

为什么会发生这种情况而不是第一个例子中的if语句?

注意:我在游乐场进行测试,版本6.1.1(6A2008a)。

2 个答案:

答案 0 :(得分:1)

var shoppingList = ["item1": "bread", "item2": "milk" ]

if let oldItem = shoppingList.updateValue("honey", forKey: "item2") {
    println("old value was \(oldItem)")
}

// This prints out "old value was milk"

因为此代码(if let声明)会解包键“item2”的值,并将未展开的值存储在oldItem中。

如果您只是这样打印:

let oldItem = shoppingList.updateValue("honey", forKey: "item2")
println("old value was \(oldItem)")

会打印Optional("old value was milk")

但是如果密钥item2没有任何值,那么程序就会崩溃。

答案 1 :(得分:1)

字典上的 updateValue 方法返回已替换的值。所以当你这样做时

if let oldItem = shoppingList.updateValue("honey", forKey: "item2")

将替换的值作为牛奶返回到oldItem。

println("old value was \(oldItem)")

oldItem返回它拥有的旧值。

注意:在字典上执行updateValue时,如果显示密钥,则会更新新的键/值对。如果未显示密钥,则将新的密钥/值对添加到字典中。如果密钥存在,则updateValue返回旧的更新值,否则返回nil。