【问题标题】:Swift: About assign nil to a varSwift:关于将 nil 分配给 var
【发布时间】:2016-10-08 00:12:15
【问题描述】:

我在尝试学习 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 方法会返回一个可选值,以防键“George Bush”不会返回值而是 nil,所以我们需要使用 if let 安全地解开它。 但是,解决方案代码如下所示:

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

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

var value:String?
value = nil

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

【问题讨论】:

  • 请在下面回答我。

标签: swift optional


【解决方案1】:

非常好的问题!

由于您的数组被定义为[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 = 总统宠物Dict.removeValueForKey("Georgee Bush") 仍然有效?我的意思是关键实际上是“乔治布什”所以这将返回 nil 到 oldValue,但我们根本没有将 oldValue 声明为选项。
  • 是的,您确实将 oldValue 声明为可选。当您编写var oldValue = presidentialPetsDict.removeValueForKey("Georgee Bush") 时,编译器会查看removeValueForKey 返回的类型并使用它来定义oldValue 的类型。那个类型是String?。只需在 Xcode 中的 alt+click 方法调用上查看返回的类型。
【解决方案2】:
var oldValue = presidentialPetsDict.removeValueForKey("George Bush")

oldValue 由于返回类型的类型推断而得到 Optional String。

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

【讨论】:

    猜你喜欢
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多