Swift:关于为var分配nil

问题描述 投票:3回答:2

我试图了解swift基础知识,我遇到了这个问题:

假设我们有一个dic:

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

并删除“乔治布什”的条目,并替换为“乔治W.布什”的条目:

我做了什么:

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

因为我相信removeValueForKey方法将返回一个可选值,以防键“乔治布什”不会返回值但是为零,所以我们需要使用if let安全地解包它。但是,解决方案代码如下所示:

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

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

var value:String?
value = nil

但上面的解决方案代码即使该方法返回nil也可以工作,有人可以解释为什么它有效,因为我认为在解决方案中我们没有将oldValue声明为可选的。

swift optional
2个回答
2
投票

非常好的问题!

由于你的数组被定义为[String:String],你想知道为什么编译器允许你为一个值赋一个可选的String(所以String?)。

编译器如何冒险将nil置于应该是非可选String的内容中?

这段代码怎么编译?

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]

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

由于返回类型的类型推断,oldValue获取可选字符串。

请参阅removeValueForKey public mutating func removeValueForKey(key:Key) - > Value的函数定义?

© www.soinside.com 2019 - 2024. All rights reserved.