我试图了解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声明为可选的。
由于你的数组被定义为[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]
var oldValue = presidentialPetsDict.removeValueForKey("George Bush")
由于返回类型的类型推断,oldValue获取可选字符串。
请参阅removeValueForKey public mutating func removeValueForKey(key:Key) - > Value的函数定义?