我有两个枚举:
public enum ServerState { case Connecting case Open case LoggedIn case Closed case Error(NSError) } enum TransportLayerState { case Disconnected(NSError?) case Connecting case Connected }
如果ServerState设置为基础TL State无法实现的状态,则需要在它们之间进行切换,并返回’false’。例如,如果将返回false serverState == .Open && tlState == .Disconnected。我试图使用switch语句执行此操作,但是我发现我真正想要的是匹配一个状态 不是 特定状态的情况。例如:
serverState == .Open && tlState == .Disconnected
switch (serverState, tlState) { case (.Connecting, !.Connecting): return false case (.Closed, !.Disconnected(.None)): return false case (.Error(_), !.Disconnected(.Some(_)): return false case (.Open, !.Connected), (.LoggedIn, !.Connected): return false default: return true }
显然,这是行不通的,因为您不能放在!case语句之前。我唯一的其他选择是指定所有 允许的 情况,而这种情况要多得多。指定限制并允许所有其他状态组合更有意义,但是我不确定如何执行此操作。有任何想法吗?我还试图避免嵌套的switch语句。
!
注意:我知道我可以使用Swift 2来做到这一点if case,但是由于这是生产代码,所以我现在不能使用Swift 2。因此,请使用Swift 1.2中的解决方案做出回应。
if case
由于所有模式都按顺序检查(第一个匹配项“获胜”),因此您可以执行以下操作:
switch (serverState, tlState) { case (.Connecting, .Connecting): return true // Both connecting case (.Connecting, _): return false // First connecting, second something else case (.Closed, .Disconnected(.None)): return true case (.Closed, _): return false // and so on ...
因此,通常,可以使用两种模式来匹配其中一个状态 不是 特定状态的情况:第一个 匹配 状态,第二个是通配符模式(_),然后匹配所有其他情况。
_