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?
我正在尝试学习 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?