如何在 Swift 中优雅地检查 .first(where:) 闭包中的 case 枚举?

X. *_*. W 0 enums swift

假设我有这个枚举:

enum Item {
  case foo(String)
  case bar(String)
}
Run Code Online (Sandbox Code Playgroud)

以及它的列表:

let items: [Item] = [.foo("aa"), .bar("bb")]
Run Code Online (Sandbox Code Playgroud)

我想找到它的第一 foo项,这就是我所做的:

items.first { (item) -> Bool in
  switch item {
  case .foo:
    return true
  default:
    return false
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有优雅的方式来写这样的东西:

items.first { case .foo = $0 }
Run Code Online (Sandbox Code Playgroud)

(上面的代码显然不起作用)

dfr*_*fri 5

具有关联值的枚举器(编辑问题)

如果您有一个枚举,其枚举数具有关联的值,则可以替换该switch语句 ifif case (let) ... else语句,因为您专门搜索给定的枚举数模式(其余的都没有 -> else)。例如:

let item = items.first { 
    if case .foo = $0 { return true }
    else { return false }
}
Run Code Online (Sandbox Code Playgroud)

没有关联值的枚举器(原始问题)

=是赋值,而==是相等比较。在这里,您想要后者:

let item = items.first { $0 == .foo }

// or
let item = items.first { .foo == $0 }
Run Code Online (Sandbox Code Playgroud)

您还可以使用~=运算符来使用模式匹配:

let item = items.first { $0 ~= .foo }

// or
let item = items.first { .foo ~= $0 }
Run Code Online (Sandbox Code Playgroud)