我有一个枚举:
enum E {
case A, B, C(Int)
}
let a: E = .A
Run Code Online (Sandbox Code Playgroud)
这是我如何检查是否a等于.B
if case .B = a {
// works fine
}
Run Code Online (Sandbox Code Playgroud)
但是我如何检查相反的情况呢?(a 不相等.B)?这是我试过的:
if case .B != a { // Variable binding in a condition requires an initializer
// ...
}
if !(case .B = a) { // Expected ',' separator
// ...
}
Run Code Online (Sandbox Code Playgroud)
当然,我可以这样做:
if case .B = a {
// ...
} else {
// put your code here
}
Run Code Online (Sandbox Code Playgroud)
但这很尴尬,还有使用switch声明.还有更好的选择吗?
编辑:解决方案@Greg建议如果案例没有关联值,但是如果它们确实==需要重载运算符.很抱歉没有在第一时间澄清这一点.
vac*_*ama 26
这个"答案"只不过是以更紧凑的方式编写尴尬的解决方案.如果你只关心一个值不是某个枚举值的情况,你可以像这样把它写在一行中,else紧跟在then then子句后面:
enum E {
case A, B(String), C(Int)
}
let a: E = .B("Hello")
if case .A = a {} else {
print("not an A")
}
if case .B = a {} else {
print("not a B")
}
if case .C = a {} else {
print("not a C")
}
Run Code Online (Sandbox Code Playgroud)
您正在使用single = sign,这是一个赋值运算符.你必须使用double ==这是一个比较而且不使用case .A,使用EA是正确的方法:
if E.A == a {
// works fine
print("1111")
}
if E.B != a {
// works fine
print("2222")
}
if E.B == a {
// works fine
print("3333")
}
Run Code Online (Sandbox Code Playgroud)
扩展:
要使它与关联值一起使用,您必须实现Equatable协议,例如:
extension E: Equatable {}
func ==(lhs: E, rhs: E) -> Bool {
switch (lhs, rhs) {
case (let .C(x1), let .C(x2)):
return x1 == x2
case (.A, .A):
return true
default:
return false
}
}
Run Code Online (Sandbox Code Playgroud)
当然,你必须处理所有的可能性,但我认为你有一个想法.
扩展:
我没有收到您的评论,但这对我很有用:
enum E {
case A, B, C(Int)
}
extension E: Equatable {}
func ==(lhs: E, rhs: E) -> Bool {
switch (lhs, rhs) {
case (let .C(x1), let .C(x2)):
return x1 == x2
case (.A, .A):
return true
case (.B, .B):
return true
default:
return false
}
}
let a: E = .A
let b: E = .B
let c: E = .C(11)
if E.A == a {
// works fine
print("aaa true")
}
if E.A != a {
// works fine
print("aaa false")
}
if E.B == b {
// works fine
print("bbb true")
}
if E.B == b {
// works fine
print("bbb false")
}
if E.C(11) == c {
// works fine
print("ccc true")
}
if E.C(11) != c {
// works fine
print("1 ccc false")
}
if E.C(22) != c {
// works fine
print("2 ccc false")
}
Run Code Online (Sandbox Code Playgroud)
没有任何答案可以提及guardSwift 2引入的声明,它是上述工具的一个简洁的补充,如果你问我,如果你可以满足return你的功能或关闭内部的要求,那就是最干净的解决方案.else-块:
guard case .B = a else {
// a does not match .B
return
}
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅Apple的"Swift编程语言(Swift 2.2):语句".