Swift:关于将nil分配给变量

3

我是一名帮助翻译的助手。

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

假设我们有一个字典:

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方法会在键“George Bush”没有返回值但是返回nil时返回一个可选值,因此我们需要使用if let进行安全解包。 但是,解决方案的代码如下:

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

我不理解的是,如果我们想将nil赋值给一个变量,通常会这样做:

var value:String?
value = nil

但是上面的解决方案代码即使方法返回nil也能正常工作,有人可以解释一下为什么它能正常工作吗?因为我认为在解决方案中我们根本没有将oldValue声明为可选项。

请看下面我的回答。 - John
2个回答

2

非常好的问题!

由于您的数组被定义为[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]

谢谢回复!我知道如果你将nil分配给一个键,那么字典中的该对将被删除。然而,我的问题是为什么“var oldValue = presidentialPetsDict.removeValueForKey(“Georgee Bush”)”仍然有效?我的意思是,键实际上是“George Bush”,所以这将返回nil到oldValue,但我们根本没有声明oldValue为选项。 - Frank Guo
2
是的,您确实将oldValue声明为可选项。当您编写var oldValue = presidentialPetsDict.removeValueForKey("Georgee Bush")时,编译器会查看removeValueForKey返回的类型,并使用它来定义oldValue的类型。而那个类型是String?。只需在Xcode中对方法调用进行alt+click即可查看返回的类型。 - Luca Angeletti

1
var oldValue = presidentialPetsDict.removeValueForKey("George Bush")

由于返回类型的类型推断,oldValue变成了可选字符串。
请参阅removeValueForKey函数的定义: public mutating func removeValueForKey(key: Key) -> Value?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接