【问题标题】:What does "case" mean without switch statement in Swift?在 Swift 中没有 switch 语句的“case”是什么意思?
【发布时间】:2016-06-10 01:26:32
【问题描述】:

我遇到了这段代码,它是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
    }
}

【问题讨论】:

标签: swift switch-statement


【解决方案1】:

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

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

来自文档:

可选模式

可选模式匹配包装在 Some(Wrapped) 情况下的值 一个 Optional 或 ImplicitlyUnwrappedOptional 枚举。可选模式由标识符模式组成 紧随其后的是问号并出现在相同的位置 作为枚举案例模式。

因为可选模式是 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 语句中的可选值数组,执行 该循环仅适用于非零元素。

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

【讨论】:

  • 在我看来,这似乎(很好地)解释了可选模式是什么,但不是为什么需要、可取或什至可能需要 case。毕竟,这就是问题所要求的。
  • swift 中的选项是幕后的(通用)枚举,枚举可以取的每个可能的值都被命名为case(根据switch 语句通常用于选择一个可能的值)。 optional 的两种情况是.None(当nil)和.Some(当非零时,包装的值作为枚举情况的关联值)。我猜这就是为什么这个语法使用关键字case,即使它不是switch 语句。
  • 我提供的链接确实解释了“为什么”,引用它的内容太多了。我添加了一个关于“为什么”需要关键字的简单解释,但文档更详细。
【解决方案2】:

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

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

作为一个例子,而不是:

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

您可以改为使用:

if case 0...255 = a

这是一个微不足道的例子,但一旦您意识到可供您使用的大量模式匹配选项,它就会变得更加有用。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 2023-03-31
  • 1970-01-01
  • 2011-11-18
  • 2011-08-15
相关资源
最近更新 更多