gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 22:29:23 25 4
gpt4 key购买 nike

考虑以下涉及nil 合并运算符 ?? 的示例:

let mysteryInc = ["Fred": "Jones", "Scooby-Doo": nil]

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

print(lastname == nil) // true

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

如果 nil 合并运算符 应该解包 Optional,为什么它返回 nil

最佳答案

要查看这里发生了什么,请将字典查找分配给一个常量:

let name = mysteryInc["Scooby-Doo"]
print(type(of: name))

输出:

Optional<Optional<String>>

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

当应用nil 合并运算符 时,它解开外层Optional 并留下一个Optional<String>。 (又名 String? )。在问题的示例中,Swift 处理字符串文字 "no last name"作为类型 String?这样??可以应用。

如果您检查 name 的值你会发现它是Optional(nil) .所有字典查找都返回 Optionals 因为 key 可能不存在(在这种情况下它们返回 nil )。在这种情况下,mysteryInc字典的类型是 [String: String?] . "Scooby-Doo"对应的值是nil然后它被包装成一个Optional(因为字典查找)成为Optional(nil) .

最后,值Optional(nil)?? 展开.自 Optional(nil) != nil , Swift 展开 Optional(nil)并返回 nil而不是返回预期的 "no last name" .

这就是您获得 nil 的方式来自 nil 合并运算符。它确实打开了Optional;恰好有一个nil在那个可选的里面。


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

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

实际上,由于@Sulthan 提出的原因,最好避免将Optionals 作为字典的值:

什么是mysteryInc["Fred"] = nil做什么?

正在分配 nil到字典条目从字典中删除该条目,所以 mysteryInc["Fred"] = nil不替换 Optional("Jones")nil , 它删除了 "Fred"完全进入。离开"Fred"在字典里写上他的姓nil , 你需要分配 mysteryInc["Fred"] = Optional(nil)mysteryInc.updateValue(nil, forKey: "Fred") .

关于swift - 为什么 nil 合并运算符 ??返回零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44330367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com