gpt4 book ai didi

swift - 递归类型中的 switch 必须是详尽无遗的

转载 作者:行者123 更新时间:2023-12-02 09:05:55 26 4
gpt4 key购买 nike

enum Tree<Element: Comparable> {
case empty
indirect case node(Tree<Element>, Element, Tree<Element>)

func forEach(withLooping fn: (Element) -> Void) {
var stack = [self]
while !stack.isEmpty {
let current = stack.popLast()
switch current {
case .empty: break
case let .node(left, value, right):
fn(value)
stack.append(left)
stack.append(right)
case .none: // !!!
break
}
}
}
}

Xcode 强制我添加 .none 大小写,但是 .none 不是 Tree 的构造函数

xxx.swift:9:7: error: switch must be exhaustive
switch current {
^
xxx.swift:9:7: note: add missing case: '.none'
switch current {

为什么?

最佳答案

问题不在于枚举是递归的,而在于 popLast()方法返回一个可选的(如果数组为空则为nil)。因此 current 的可能情况是

case .some(.empty):
case .some(.node(left, value, right)):
case .none: // Or equivalently: case nil:

从 Swift 5.1 开始,枚举大小写可以与非可选枚举模式匹配(比较 SR-7799 ),因此这简化为

case .empty:
case .node(left, value, right):
case .none: // Or equivalently: case nil:

这解释了编译器错误和修复它。但是,nil 情况不会发生,因为您检查数组是否为空。以下是三种可能的解决方案:

  • 由于您已经检查过堆栈不为空,因此您可以安全地强制解包

    while !stack.isEmpty {
    let current = stack.popLast()!
    switch current {
    // ...
  • 使用 removeLast()反而。此方法期望数组不为空,并返回一个(非可选)数组元素:

    while !stack.isEmpty {
    let current = stack.removeLast()
    switch current {
    // ...
  • 在 while 条件中使用带有可选绑定(bind)的 popLast():

    while let current = stack.popLast() {
    switch current {
    // ...

关于swift - 递归类型中的 switch 必须是详尽无遗的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58629715/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com