没有switch语句在Swift中"case"是什么意思?

Kei*_*out 10 switch-statement swift

我遇到了这个代码,它是Swift算法俱乐部中链接列表的Swift实现的一部分.在整个实现过程中,作者case let在打开一个可选项之前使用了一个while语句.我从来没有看到在switch语句的上下文之外使用case关键字,我想知道它到底是做什么的?它是否以某种方式将该let next? = node.next部分转换为真或假,可能取决于是否next?变为零?

public var last: Node? {
    if var node = head {
        while case let next? = node.next {
            node = next
        }
        return node
    } else {
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)

Col*_*aff 14

这是可选模式.它测试并解包Optional,仅在Optional非零时才执行条件.

该关键字case是必需的,因为它遵循原始switch... case语法.该case测试模式,如果匹配,则执行下面的语句.在你的例子中let next?是模式.如果值已解包并已分配,则执行case匹配和代码.

从文档:

可选模式

可选模式匹配包含在Optional或ImplicitlyUnwrappedOptional枚举的Some(Wrapped)情况中的值.可选模式由标识符模式组成,后面紧跟一个问号,并显示在与枚举案例模式相同的位置.

因为可选模式是Optional和ImplicitlyUnwrappedOptional枚举案例模式的语法糖,所以以下是等效的:

let someOptional: Int? = 42
// Match using an enumeration case pattern
if case .Some(let x) = someOptional {
    print(x)
}

// Match using an optional pattern
if case let x? = someOptional {
    print(x)
}
Run Code Online (Sandbox Code Playgroud)

可选模式提供了一种方便的方法来迭代for-in语句中的可选值数组,仅对非nil元素执行循环体.

let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5]
// Match only non-nil values
for case let number? in arrayOfOptionalInts {
    print("Found a \(number)")
}
// Found a 2
// Found a 3
// Found a 5
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这很好地解释了一个可选模式是什么,但是*不是*为什么`case`是需要的,可取的,甚至是可能的.毕竟,问题是要求的. (5认同)
  • swift中的可选项是幕后的(通用)枚举,枚举可以采用的每个可能的值都被命名为`case`(根据通常用于选择许多可能值之一的`switch`语句).可选的两个例子是`.None`(当'nil`时)和`.Some`(当非nil时,包装的值作为枚举情况的相关值).我想这就是为什么这个语法使用关键字`case`,即使它不是`switch`语句. (4认同)