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)) 输出:
所以,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”). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |