引用没有关联值的Swift枚举成员

时间:2015-06-17 10:38:15

标签: swift enums

我有以下枚举:

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。我应该期待新版本的一些改进吗?另一个问题是,在它发布之前,是否有任何解决方法?

3 个答案:

答案 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将带来另一种可能你会欣赏的控制流语法:

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!");