2016-02-29 80 views
3

我试图返回我自己在Swift中实现双向链表的头元素。 我的节点被声明为这样一个枚举:Swift guard语句模式与枚举匹配

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

回答

9

两个问题:

  • 不得重复仿制占位<Element>的格局。
  • head可选,所以你必须匹配它与 .Some(...)

因此:

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

,或者利用等效x?图案:

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