Swift 切换大小写 "not"
Swift Switch case "not"
我有两个枚举:
public enum ServerState {
case Connecting
case Open
case LoggedIn
case Closed
case Error(NSError)
}
enum TransportLayerState {
case Disconnected(NSError?)
case Connecting
case Connected
}
我需要在它们之间切换,如果 return 'false' 如果 ServerState 设置为底层 TL 状态不可能的状态。例如,如果 serverState == .Open && tlState == .Disconnected
,它将 return 为假。我正在尝试使用 switch 语句来执行此操作,但我发现我真正想要的是匹配其中一个状态是 not 特定状态的情况。例如:
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 语句之前放置 !
。我唯一的其他选择是指定所有 allowable 案例,这些案例要多得多。指定限制并允许所有其他状态组合更有意义,但我不确定如何执行此操作。有任何想法吗?我也在努力避免嵌套的 switch 语句。
注意:我知道我可以使用 Swift 2 的 if case
来执行此操作,但我现在不能使用 Swift 2,因为这是生产代码。因此,请在 Swift 1.2.
中提供解决方案
由于所有模式都是按顺序检查的(第一个匹配 "wins"),
您可以执行以下操作:
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 ...
所以一般来说,匹配其中一个状态不是的情况可以用两种模式来完成:第一个匹配 状态,
第二个是通配符模式(_
),然后匹配所有其他
案例。
我找到的一个可能的答案是使 TransportLayerState
相等。在那种情况下我可以这样做:
switch serverState {
case .Connecting where tlState != .Connecting: return false
case .Closed where tlState != .Disconnected(nil): return false
case let .Error(err) where tlState != .Diconnected(err): return false
...
default: return true
}
我最终不得不在 TransportLayerState
枚举中编写一些代码以使其相等,所以不确定是否值得付出努力,但它确实有效。
我有两个枚举:
public enum ServerState {
case Connecting
case Open
case LoggedIn
case Closed
case Error(NSError)
}
enum TransportLayerState {
case Disconnected(NSError?)
case Connecting
case Connected
}
我需要在它们之间切换,如果 return 'false' 如果 ServerState 设置为底层 TL 状态不可能的状态。例如,如果 serverState == .Open && tlState == .Disconnected
,它将 return 为假。我正在尝试使用 switch 语句来执行此操作,但我发现我真正想要的是匹配其中一个状态是 not 特定状态的情况。例如:
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 语句之前放置 !
。我唯一的其他选择是指定所有 allowable 案例,这些案例要多得多。指定限制并允许所有其他状态组合更有意义,但我不确定如何执行此操作。有任何想法吗?我也在努力避免嵌套的 switch 语句。
注意:我知道我可以使用 Swift 2 的 if case
来执行此操作,但我现在不能使用 Swift 2,因为这是生产代码。因此,请在 Swift 1.2.
由于所有模式都是按顺序检查的(第一个匹配 "wins"), 您可以执行以下操作:
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 ...
所以一般来说,匹配其中一个状态不是的情况可以用两种模式来完成:第一个匹配 状态,
第二个是通配符模式(_
),然后匹配所有其他
案例。
我找到的一个可能的答案是使 TransportLayerState
相等。在那种情况下我可以这样做:
switch serverState {
case .Connecting where tlState != .Connecting: return false
case .Closed where tlState != .Disconnected(nil): return false
case let .Error(err) where tlState != .Diconnected(err): return false
...
default: return true
}
我最终不得不在 TransportLayerState
枚举中编写一些代码以使其相等,所以不确定是否值得付出努力,但它确实有效。