我有以下枚举:
enum State: Equatable {
case Loading
case Finished
case Error(message: String)
}
func ==(lhs: State, rhs: State) -> Bool {
//...
}
我希望能够比较枚举成员。我有重载==
运算符,它有效,但有一个问题:
let state: State = .Loading
// works just fine
let thisWorks = state == .Finished
// this does as well
let thisWorks2 = state == .Error("Derp!")
// this, however, does not, compiler error: "Could not find member 'Error'"
let thisDoesnt = state == .Error
这似乎是编译器的限制。我不明白为什么我不应该在没有相关值的情况下引用枚举成员。显然我不关心与.Error
相关的错误消息,我只需要知道是否发生了错误。这实际上可以用switch
,所以我不知道为什么常规语句是有限的。
我必须承认我没有密切关注Swift 2。我应该期待新版本的一些改进吗?另一个问题是,在它发布之前,是否有任何解决方法?
答案 0 :(得分:4)
Enums与switch
:
let state: State = .Error(message: "Foo")
switch state {
case .Loading:
print("Loading")
case .Finished:
print("Finished")
case .Error(message: "Foo"):
print("Foo!!!")
case .Error(message: _):
print("Some other error")
}
Swift 2.0将带来另一种可能你会欣赏的控制流语法:
if case .Error(message: _) = state {
print("An Error")
}
希望这有帮助
答案 1 :(得分:1)
您正在创建枚举的新实例。您的错误枚举具有必需关联值。它不能是零。因此,当您创建枚举时,必须为其赋值。
如果使错误状态的关联值可选,那该怎么办?
enum State: Equatable {
case Loading
case Finished
case Error(message: String?)
然后你可以使用这样的代码:
let thisDoesnt = state == .Error(nil)
答案 2 :(得分:-1)
试试吧。
let thisWorks2 = state == .Error(message: "Derp!");