我在编写带有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?
有谁知道为什么会这样?或者这是我应该提交的编译器错误?
答案 0 :(得分:1)
请阅读关于警卫声明的Apple文档:
在你的情况下应该有
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
}