与enum

时间:2016-02-29 12:09:07

标签: swift enums pattern-matching

我正在尝试在Swift中返回我自己实现的双链接列表的head元素。 我的节点被声明为这样的枚举:

enum DLLNode<Element>{
    indirect case Head(element: Element, next: DLLNode<Element>)
    indirect case Node(prev: DLLNode<Element>, element: Element, next: DLLNode<Element>)
    indirect case Tail(prev: DLLNode<Element>, element: Element)
}

和列表实现如下:

struct DLList<Element> {
    var head:DLLNode<Element>?

...

func getFirst()throws->Element{
        if self.isEmpty(){
            throw ListError.EmptyList(msg: "")
        }
        guard case let DLLNode<Element>.Head(element: e, next: _) = head
            else{
                throw ListError.UnknownError(msg: "")
        }
        return e
    }
}

但我在守卫声明中得到"Invalid pattern"。如果我省略DLLNode<Element>并保持guard case let .Head(element: e, next: _) = head,则会给我"Enum case 'Head' not found in 'guard case let DLLNode<Element>.Head(element: e, next: _) = head'" 我究竟做错了什么?或者也许有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:12)

两个问题:

  • 您不得在模式中重复通用占位符<Element>
  • head可选,因此您必须将其匹配 .Some(...)

因此:

guard case let .Some(.Head(element: e, next: _)) = head

或使用等效的x?模式:

guard case let .Head(element: e, next: _)? = head