什么"案例"在Swift中没有switch语句意味着什么?

时间:2016-06-10 01:26:32

标签: swift switch-statement

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

public var last: Node? {
    if var node = head {
        while case let next? = node.next {
            node = next
        }
        return node
    } else {
        return nil
    }
}

2 个答案:

答案 0 :(得分:14)

这是Optional Pattern。它测试并解包Optional,仅在Optional为非零时才执行条件。

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

来自文档:

  

可选模式

     

可选模式匹配包含在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)
}
     

可选模式提供了一种迭代方便的方法   for-in语句中的可选值数组,执行body的主体   该循环仅适用于非零元素。

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

答案 1 :(得分:3)

Swift 2从switch/case语句中采用了模式范例,并允许它在其他上下文中使用(ifwhile等等。)

现在,您可以在条件语句中使用这些模式匹配比较,而不仅仅是简单的比较。

作为一个例子,而不是:

if (a >= 0) and (a <= 255)

你可以改用:

if case 0...255 = a

这是一个微不足道的例子,但是一旦你意识到可用的相当多的模式匹配选项,它就会变得更有用。