微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift – 为什么nil合并运算符?返回零?

考虑以下涉及nil合并运算符的示例??:
let mysteryInc = ["Fred": "Jones","Scooby-Doo": nil]

let lastname = mysteryInc["Scooby-Doo"] ?? "no last name"

print(lastname == nil)  // true

如最后一个print语句所示,nil合并运算符的结果为nil.

如果nil coalescing运算符应该打开一个Optional,为什么它返回nil?

要查看此处发生了什么,请将字典指定为常量:
let name = mysteryInc["Scooby-Doo"]
print(type(of: name))

输出

06001

所以,name是一个双重可选,一个String ??.

当应用nil合并运算符时,它会解包外部的Optional并留下一个Optional< String> (又名String?).在问题的示例中,Swift将String文字“无姓”视为String类型?以便 ??可以应用.

如果检查name的值,您会发现它是Optional(nil).所有字典查找返回Optionals,因为密钥可能不存在(在这种情况下它们返回nil).在这种情况下,mysteryInc字典的类型为[String:String?].对应于“Scooby-Doo”的值为nil,然后将其包装成Optional(因为字典查找)成为Optional(nil).

最后,值Optional(nil)由??解包.由于Optional(nil)!= nil,Swift unwraps Optional(nil)并返回nil而不是返回预期的“no last name”.

这就是你如何从零合并运算符中得到零.它解开了Optional;恰好在那个Optional中只有一个零.

正如@LeoDabus在评论中指出的那样,处理这种情况的正确方法是在应用nil合并运算符之前有条件地将名称转换为String:

let lastname = mysteryInc["Scooby-Doo"] as? String ?? "no last name"

实际上,最好避免将Optionals作为字典的值,因为@Sulthan引发了:

mysteryInc [“Fred”] = nil做什么?

将nil分配给字典条目会从字典中删除该条目,因此mysteryInc [“Fred”] = nil不会用nil替换Optional(“Jones”),它会完全删除“Fred”条目.要将“Fred”留在字典中并使其姓氏为nil,您需要指定mysteryInc [“Fred”] = Optional(nil)或mysteryInc.updateValue(nil,forKey:“Fred”).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐