加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 02:26:32 所属栏目:百科 来源:网络整理
导读:考虑以下涉及nil合并运算符的示例??: let mysteryInc = ["Fred": "Jones","Scooby-Doo": nil]let lastname = mysteryInc["Scooby-Doo"] ?? "no last name"print(lastname == nil) // true 如最后一个print语句所示,nil合并运算符的结果为nil. 如果nil coale
考虑以下涉及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”).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读