什么?在 Swift case let 模式匹配中的变量声明是什么意思?

What does ?? mean on a variable declaration in Swift case let pattern matching?

我正在内部审查一些拉取请求,并看到这样的模式匹配语句:

if case let presentationAnchor?? = UIApplication.shared.delegate?.window,

现在我明白 ??= 的另一边使用时是一个 nil 合并运算符,例如aString ?? "default value",但是当它用在 = 赋值的左侧时,它是什么?有没有什么方法可以在分配时解包一个可选的?

在模式匹配的上下文中,x? 是“可选模式”,等同于.some(x)。因此,case x?? 是一个“双重可选模式”,相当于 .some(.some(x)).

这里使用它是因为 UIApplication.shared.delegate?.window 评估为“双重可选” UIWindow??,比较 .

因此

if case let presentationAnchor?? = UIApplication.shared.delegate?.window

匹配 UIApplication.shared.delegate 不为零的情况 委托实现(可选)window 属性。在这种情况下,presentationAnchor 绑定到“双重展开”UIWindow

另见 Swift 参考文献中的 Optional Pattern

An optional pattern matches values wrapped in a some(Wrapped) case of an Optional<Wrapped> enumeration. Optional patterns consist of an identifier pattern followed immediately by a question mark and appear in the same places as enumeration case patterns.

if case let someVar? = anotherVar

的语法糖
if case let .some(someVar) = anotherVar

添加另一个问号扩展为双可选,等同于

if case let .some(.some(someVar)) = anotherVar

模式匹配左侧的两个问号表示如果 double 可选值在两个级别都具有非 nil 值,则 if 将被执行。