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
当应用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] 举报,一经查实,本站将立刻删除。