SwiftUI - 对不同的选择器使用除一个枚举值之外的所有值

Zon*_*eva 2 enums picker swift swiftui

在我的应用程序中,我需要使用Picker在两个不同的地方使用 a 。在一个地方,它将属性设置为三个值之一:A、B 或 C。但是,在另一个地方,我想使用选择器来过滤项目数组以显示所有项目(无过滤器)或仅 A、B 或 C 项。

所以,我的第一次尝试是创建一个enum像这样的:

enum Category {
  case all
  case A
  case B
  case C
}
Run Code Online (Sandbox Code Playgroud)

使用它,我可以成功过滤我的列表。但是,当我尝试在数组中创建新项目时,我不想all成为一个选项。用户应该只能看到包含 A、B 和 C 的选择器。

我可以尝试:

enum Category {
  case A
  case B
  case C
}
Run Code Online (Sandbox Code Playgroud)

但是如何添加all过滤器选择器的选项呢?

(为了解决下面的一些评论,这里有一些关于我试图完成的具体事情的更多细节......

锦标赛可以是男子、女子或混合锦标赛。在列出锦标赛的屏幕上,我希望能够显示所有锦标赛或仅显示男子锦标赛、仅显示女子锦标赛或仅显示混合锦标赛。所以,我有一个横跨 iPhone 宽度的选择器。看起来和工作都很棒。

显然,当向列表添加新项目时,我必须指定其类别,但不是“全部”。也是一个拾取器。

因此,在一种情况下,我需要三个值,在另一种情况下,我需要相同的三个值,并在开头添加“All”。)

rob*_*off 6

您应该在enum不区分大小写的all情况下定义您的内容,因为它对于项目all无效。Category(这是一个名为 \xe2\x80\x9c 的编程指南,使非法状态无法表示\xe2\x80\x9d。)

\n
enum Category: Hashable, CaseIterable {\n    case a\n    case b\n    case c\n}\n
Run Code Online (Sandbox Code Playgroud)\n

有了这个定义,Picker设置项目属性的方法可以如下所示:

\n
Picker("Category", selection: $category) {\n    ForEach(Category.allCases, id: \\.self) { category in\n        Text(verbatim: "\\(category)")\n            .tag(category)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

那么你应该认识到你的过滤器是可选的。您可以按项目类别进行过滤,也可以不执行任何过滤。所以你的过滤器属性应该声明为可选:

\n
@Binding var categoryFilter: Category?\n
Run Code Online (Sandbox Code Playgroud)\n

这Picker过滤器时需要小心使用可选标签:

\n
Picker("Category Filter", selection: $categoryFilter) {\n    Text("None")\n        .tag(Category?.none)\n    ForEach(Category.allCases, id: \\.self) { category in\n        Text(verbatim: "\\(category)")\n            .tag(Category?.some(category))\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n