可选的枚举初始值设定项不使用where子句

时间:2016-02-17 18:30:54

标签: swift swift2

我在编写带有guard子句的where时遇到问题,并且想要验证我是否正确执行此操作或者编译器是否有错误。

我有这个枚举:

enum Command: String {
    case Init
    case Update
}

然后这个警卫声明

let cmdStr = "Init"

guard let command = Command(rawValue: cmdStr) where command != nil else {
    print("invalid command: \(cmdStr)") // Error: Value of type Command can never be nil, comparison isn't allowed
    return nil
}

我得到的错误很奇怪,因为rawValue初始化程序是一个可选的初始化程序。内省command表明它是Command类型,即使初始化程序导致可选。

但是,如果我首先在保护声明之外执行此操作并重写如下:

let cmdStr = "Init"
let cmd = Command(rawValue: cmdStr)

guard cmd != nil else {
    print("invalid command: \(cmdStr)")
    return nil
}

它的作用和cmd的内省显示了Command?

的预期类型

有谁知道为什么会这样?或者这是我应该提交的编译器错误?

1 个答案:

答案 0 :(得分:1)

请阅读关于警卫声明的Apple文档:

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ControlFlow.html#//apple_ref/doc/uid/TP40014097-CH9-ID525

在你的情况下应该有

let cmdStr = "Init"

guard let command = Command(rawValue: cmdStr) else {
    print("invalid command: \(cmdStr)") // Error: Value of type Command can never be nil, comparison isn't allowed
    return nil
}