我遇到了这段代码,它是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
}
}
答案 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
语句中采用了模式范例,并允许它在其他上下文中使用(if
,while
等等。)
现在,您可以在条件语句中使用这些模式匹配比较,而不仅仅是简单的比较。
作为一个例子,而不是:
if (a >= 0) and (a <= 255)
你可以改用:
if case 0...255 = a
这是一个微不足道的例子,但是一旦你意识到可用的相当多的模式匹配选项,它就会变得更有用。