Swift Guard语句模式与枚举匹配

Leo*_*ues 4 enums pattern-matching swift

我试图在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)
}
Run Code Online (Sandbox Code Playgroud)

和列表实现如下:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

但我正在接受"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'" 我做错了什么?或者也许有更好的方法来做到这一点?

Mar*_*n R 12

两个问题:

  • 您不能<Element>在模式中重复通用占位符.
  • head是可选的,所以你必须匹配它 .Some(...).

因此:

guard case let .Some(.Head(element: e, next: _)) = head
Run Code Online (Sandbox Code Playgroud)

或者,使用等效x?模式:

guard case let .Head(element: e, next: _)? = head
Run Code Online (Sandbox Code Playgroud)