2015-11-06 72 views
1

我有以下枚举:斯威夫特枚举与论证:如何比较呢?

enum Message: ErrorType { 
    case MessageWithInfo(info:String?) 
    case MessageDidFail 
    case MessageDidSend(info:String) 
    case InvalidMessageData 
    case MessageWithDelay(delay:Double) 
    .... will keep adding more 
} 

我试图找出如何写Equatable功能,它可以让我,然后比较留言枚举。

我在堆栈溢出中发现了一些类似的问题,但是我找不到能让我比较而不必切换每一种情况的东西。

有没有办法写一次equatable函数,并让它工作,即使我不断向这个枚举中添加更多的case?

+1

对于相关的值枚举你必须明确地落实==自己。这意味着,你必须在一切可能的情况下进行切换。我认为没有办法解决这个问题。 –

+1

的可能的复制[如何测试与相关联的值夫特枚举的平等](http://stackoverflow.com/questions/24339807/how-to-test-equality-of-swift-enums-with-associated-values)。 –

回答

2

这是不可能写一个函数,将与各种情况下的所有枚举工作。基本上就是你想要的。

原因是讨论here。第二个答案示出了可与具有rawValue枚举可以使用的方法。

这是因为混合类型的枚举失去了rawValue。

你可以写一个开关来获得一个rawValue(你必须忽略关联的值)。但这不能自动完成。

对于Struct或Class,你也不能写一个方法来自动创建一个在其中声明的所有var的序列/集合。就像一个枚举不能够进行序列/套出它的案件。

enum Message: ErrorType { 

    case MessageWithInfo(info:String?) 
    case MessageDidFail 
    case MessageDidSend(info:String) 
    case InvalidMessageData 
    case MessageWithDelay(delay:Double) 

    var rawValue : Int { 
     get { 
      switch self { 
      case .MessageWithInfo(info: _) : return 0 
      case .MessageDidFail : return 1 
      case .MessageDidSend(info: _) : return 2 
      case .InvalidMessageData : return 3 
      case .MessageWithDelay(delay: _) : return 4 

      } 
     } 
    } 
} 

func ==(lhs:Message,rhs:Message) -> Bool { 

    return (lhs.rawValue == rhs.rawValue) 

}