我有一个带有相关值的枚举:
enum SessionState {
...
case active(authToken: String)
...
}
我可以使用case let
将枚举案例与相关值进行比较:
if case .active = session.state {
return true
} else {
return false
}
但我可以直接将case
作为bool表达式返回吗?类似的东西:
// Error: Enum 'case' is not allowed outside of an enum
return (case .active = session.state)
简单的比较也不起作用:
// Binary operator '==' cannot be applied to operands of type 'SessionState' and '_'
return (session.state == .active)
答案 0 :(得分:5)
很遗憾,您不能(直接)将case
条件用作Bool
表达式。它们只能在if
,guard
,while
,for
等语句中使用。
详情见language grammar,其中包含:
case-condition → case pattern initializer
然后在condition
:
condition → expression | availability-condition | case-condition | optional-binding-condition
(其中expression
表示Bool
表达式)
然后在condition-list
:
condition-list → condition | condition , condition-list
然后在if
:
if-statement → if condition-list code-block else-clause opt
所以你可以看到,遗憾的是case-condition
不是表达式,而是一个可以在给定语句中使用的特殊条件。
要将其打包成表达式,您必须使用立即评估的闭包:
return { if case .active = session.state { return true }; return false }()
或以其他方式在enum
上编写便利计算属性,以便获得Bool
以检查给定的案例,如in this Q&A所示。
两者都非常令人不满意。这has been filed as an improvement request,但尚无任何结果(发布时)。希望它能够在未来的语言版本中实现。
答案 1 :(得分:0)
不,此时此刻。 但可能会在未来实施。
https://forums.swift.org/t/pitch-case-expressions-for-pattern-matching/20348