Swift: 关于将 nil 分配给 var

Swift: About assign nil to a var

我正在尝试学习 swift 基础知识,但遇到了这个问题:

假设我们有一个 dic:

var presidentialPetsDict = ["Barack Obama":"Bo", "Bill Clinton": "Socks", "George Bush": "Miss Beazley", "Ronald Reagan": "Lucky"]

并删除 "George Bush" 的条目并将其替换为 "George W. Bush" 的条目:

我做了什么:

var oldvalue = presidentialPetsDict.removeValueForKey("George Bush")
if let value = oldvalue
{
    presidentialPetsDict["George W. Bush"] = value
}else
{
    print("no matching found")
}

因为我相信 removeValueForKey 方法将 return 一个可选值,以防 key "George Bush" 不会 return 一个值而是 nil 所以我们需要使用 if let 安全地解包它。 但是,解决方案代码如下所示:

var oldValue = presidentialPetsDict.removeValueForKey("Georgee Bush")
presidentialPetsDict["George W. Bush"] = oldValue

我不明白的部分是,如果我们想将 nil 分配给 var,我们通常会这样做:

var value:String?
value = nil

但是即使方法 return 为 nil,上面的解决方案代码仍然有效,有人可以解释为什么它有效,因为我认为在解决方案中我们根本没有将 oldValue 声明为可选的。

很好的问题!

由于您的数组定义为 [String:String],您想知道为什么编译器允许您将可选的 String(因此 String?)分配给一个值。

编译器怎么会冒险将 nil 放入本应是 非可选字符串 的内容中?

这段代码如何编译?

var oldValue: String? = presidentialPetsDict.removeValueForKey("Georgee Bush")
presidentialPetsDict["George W. Bush"] = oldValue

答案在这里

下标有如下逻辑,即使Dictionary的值为String,也可以使用下标赋值nil。 在这种情况下,密钥将从数组中删除。

看这里

var numbers: [String:Int] = ["one": 1, "two": 2, "three": 3]
numbers["two"] = nil // it looks like I'm putting nil into a Int right?
numbers // ["one": 1, "three": 3]
var oldValue = presidentialPetsDict.removeValueForKey("George Bush")

oldValue 获取可选字符串,因为 return 类型的类型推断。

查看removeValueForKey的函数定义 public 变异函数 removeValueForKey(key: Key) -> Value?