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

Optionals in Swift, why this simple code doesn't print optional?

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 语句?

注意:我正在 playground 版本 6.1.1 (6A2008a) 中对此进行测试。

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 没有任何值,那么程序就会崩溃。

字典 returns 上的方法 updateValue 值已被替换。所以当你做

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

替换值milk返回到oldItem。

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

oldItem returns 它拥有的旧值。

注意:当您对字典执行 updateValue 时,如果提供了键,则会更新新的 key/value 对。如果未提供密钥,则将新的 key/value 对添加到字典中。如果键存在,updateValue returns 旧的更新值,如果不存在,returns nil。