什么?在 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
将被执行。
我正在内部审查一些拉取请求,并看到这样的模式匹配语句:
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 anOptional<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
将被执行。