首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在ForEach Swiftui的结构列表中使用枚举?

在SwiftUI中,使用ForEach来遍历和显示枚举类型的列表是一个常见的需求。为了实现这一点,你需要确保你的枚举类型符合Identifiable协议,或者你可以使用枚举的原始值(如果有)作为标识符。

以下是一个详细的示例,展示如何在ForEach中使用枚举。

示例代码

假设你有一个枚举类型Fruit,并希望在SwiftUI视图中显示一个列表。

1. 定义枚举类型

首先,定义一个枚举类型Fruit,并使其符合Identifiable协议:

代码语言:javascript
复制
import SwiftUI

enum Fruit: String, CaseIterable, Identifiable {
    case apple
    case banana
    case cherry
    case date
    case elderberry

    var id: String { self.rawValue }
}

在这个示例中:

  • Fruit枚举符合CaseIterable协议,这样可以轻松地获取所有枚举值。
  • Fruit枚举符合Identifiable协议,通过rawValue作为唯一标识符。

2. 使用ForEach显示枚举列表

接下来,在SwiftUI视图中使用ForEach来遍历和显示枚举列表:

代码语言:javascript
复制
struct ContentView: View {
    var body: some View {
        List {
            ForEach(Fruit.allCases) { fruit in
                Text(fruit.rawValue.capitalized)
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

在这个示例中:

  • Fruit.allCases返回一个包含所有枚举值的数组。
  • ForEach遍历这个数组,并为每个枚举值创建一个Text视图。
  • fruit.rawValue.capitalized将枚举值的原始字符串值转换为首字母大写的形式。

解释

  1. 枚举类型
    • Fruit枚举定义了几种水果类型,并符合CaseIterableIdentifiable协议。
    • CaseIterable协议允许你使用allCases属性来获取所有枚举值。
    • Identifiable协议要求每个枚举值有一个唯一标识符,这里使用rawValue作为标识符。
  2. SwiftUI视图
    • ContentView视图包含一个List,其中使用ForEach来遍历Fruit.allCases
    • ForEach为每个枚举值创建一个Text视图,并显示枚举值的原始字符串值。

扩展

你可以根据需要进一步扩展这个示例。例如,添加更多属性或方法到枚举类型,或者在视图中显示更多信息。

添加更多属性

代码语言:javascript
复制
enum Fruit: String, CaseIterable, Identifiable {
    case apple
    case banana
    case cherry
    case date
    case elderberry

    var id: String { self.rawValue }

    var description: String {
        switch self {
        case .apple: return "A sweet red fruit"
        case .banana: return "A long yellow fruit"
        case .cherry: return "A small red fruit"
        case .date: return "A sweet brown fruit"
        case .elderberry: return "A small dark purple fruit"
        }
    }
}

更新视图

代码语言:javascript
复制
struct ContentView: View {
    var body: some View {
        List {
            ForEach(Fruit.allCases) { fruit in
                VStack(alignment: .leading) {
                    Text(fruit.rawValue.capitalized)
                        .font(.headline)
                    Text(fruit.description)
                        .font(.subheadline)
                        .foregroundColor(.gray)
                }
            }
        }
    }
}

在这个扩展示例中,Fruit枚举增加了一个description属性,用于提供每种水果的描述。在视图中,VStack用于显示水果名称和描述。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 优化在 SwiftUI List 显示大数据集响应效率

    SwiftUI 应用代码,绝大多数视图标识都是通过结构性标识 (有关结构性标识内容可以参阅 ViewBuilder 研究(下) —— 从模仿中学习[4])来实现 —— 通过视图层次结构(视图树...在 SwiftUI 为视图设置显式标识目前有两种方式: 在 ForEach 构造方法中指定 由于 ForEach 视图数量是动态且是在运行时生成,因此需要在 ForEach 构造方法中指定可用来标识子视图...使用了 id 修饰符相当于将这些视图从 ForEach 拆分出来,因此丧失了优化条件。 总之,当前在数据量较大情况下,应避免在 List ForEach 子视图使用 id 修饰符。...虽然我们已经找到了导致进入列表视图卡顿原因,但如何在不影响效率情况下通过 scrollTo 来实现到列表端点滚动呢?...由于 id 修饰符并非惰性修饰符( Inert modifier ),因此我们无法在 ForEach 仅为列表头尾数据使用 id 修饰符。

    9.2K20

    使用 SwiftUI 创建一个灵活选择器

    前言 最近,在我正在开发一个在 Dribbble 上找到设计 SwiftUI 实现时,我想到了一个点子,可以通过一些酷炫筛选器扩展该项目以缩小结果列表。...在使用 UIKit 时,我总是将这种类型视图实现为具有特定 UICollectionViewFlowLayout UICollectionView。但在 SwiftUI 该如何实现呢?...Identifiable 和 Hashable 协议确保我们可以轻松创建具有 ForEach 循环 SwiftUI 视图。...此外,该枚举有两个属性,一个返回 UIFont 权重,另一个返回 SwiftUI Font 权重。通过这种方式,我们只需向 FlexiblePicker 提供 FontWeight 枚举特定情况。...如我之前所提到,视图将使用嵌套 ForEach 循环创建。 需要记住是,ForEach 循环要求迭代集合每个元素必须符合 Identifiable 协议,或者应该具有唯一标识符。

    29620

    Swift 周报 第四十一期

    使用了相对新但规模较小 Verse 编程语言几个月后,我开始喜欢能够在 if 语句条件列表创建中间常量和变量,以及执行常规函数能力。 我开始思考为什么 Swift 没有这样相当方便功能。...这有点类似于我们如何在结果构建器创建本地常量,这些常量不会立即被它消耗。 这个想法将扩展 if、guard 和 while 条件列表。...回答 将条件列表重构为一个单独函数使我们能够简化代码为单一 if/else 分支结构。...,以及一个可以提升理解在一个使用结构化并发程序控制流程并发意识后退功能。...掌握 SwiftUI ContentUnavailableView [10] 摘要: 这篇博客介绍了如何在 SwiftUI 掌握使用 ContentUnavailableView 类型。

    23140

    如何让 SwiftUI 列表变得更加灵活

    SwiftUI 初版概念和 API 编写,下面让我们尝试使用新功能来为我们列表实现自定义样式,并且使代码更加健壮。...元素绑定和自定义滑动操作 接下来,让我们看看如何将完全自定义滑动操作添加到列表。...为了演示这种情况,我们在 List 嵌套一个 ForEach (因为在 SwiftUI 列表变化一版都是由 ForEach 触发,而不是由 List 触发)。...SwiftUI使用,请查看昨天这篇文章[1],不要错过真正重要“在 Swift 认识 async/await[2]”WWDC 会议。...可定制分隔符 自从引入 SwiftUI 以来,开发者们有一个非常普遍要求,提供一个 API ,用于隐藏或以其他自定义实现列表每个 item 之间默认分隔符。

    4.9K41

    SwiftUI:“看我展示52张扑克牌,很快啊!”

    思路 使用 SwiftUI 创建 UI 结构使用 swift 枚举结构体实现数据生成,通过 viewModel 整合数据用于展示(交互暂时未做,因此不涉及 MVVM 设计模式数据绑定)。...//CaseIterable:当需要对枚举进行遍历时,需要遵守 CaseIterable 协议,然后对枚举 allCases 类属性进行遍历即可 enum Rank:Int, CaseIterable...感受 swift 语法在构建数据类型时比 OC 方便太多了,枚举结构体(值类型,copy-on-write)都很强大。...非共享数据优先使用结构体,类一般只用于 viewModel,用于数据共享给多个 view。...SwiftUI 使用声明式方法构建 UI,代码方面简洁了很多,一套代码,三端适用(iOS,iPadOS,macOS(M1))。而且支持实时预览,大大提高了 UI 开发效率!

    99050

    在 iOS 16 中用 SwiftUI Charts 创建一个折线图

    如以前文章所示,不使用 SwiftUI Charts 也可以创建一个折线图。然而,使用 Charts[1] 框架可以提供大量图表来探索对应用程序数据最有效方法,从而使它变得更加容易。...系列文章 如何在 SwiftUI 创建条形图 SwiftUI 水平条形图 在 iOS16 中用 SwiftUI 图表定制一个线图 在 Swift 图表中使用 Foudation 库测量类型 简单折线图...从包含一周步数数据开始,类似于 在SwiftUI创建折线图 中使用数据。...定义一个结构来保存日期和该日步数,并为当前周创建一个数组。...图表带有两个系列步数数据折线图 SwiftUI 图表带有两个系列步数数据折线图 结论 在 SwiftUI Charts 还有很多东西可以探索。

    3.7K20

    架构之路 (五) —— VIPER架构模式(一)

    开始 首先看下主要内容: 在本教程,您将了解如何在SwiftUI和Combine中使用VIPER体系结构模式,同时构建一个允许用户创建公路旅行iOS应用程序,来自翻译。...在本教程,您将使用VIPER体系结构模式构建一个应用程序。这款应用也被方便地称为VIPER。 它将允许用户通过向一条路线添加路径点来构建公路旅行。...该模型使用一个JSON文件来实现本地持久性,但是您可以使用一个远程后端来代替它,而不必修改任何ui级代码。这就是干净体系结构优点之一:当您更改一个部分(比如持久层)时,它与代码其他部分是隔离。...最后,在TripListView,在ForEach结束括号后面添加以下内容: .onDelete(perform: presenter.deleteTrip) 将. ondelete添加到SwiftUI...使用presenter向列表添加新路径点add按钮。 一个列表List,它使用ForEach与presenter为每个路点创建一个单元格。

    17.5K10

    使用 SwiftUI 为 macOS 创建类似于 App Store Connect 选择器

    我希望构建类似于 App Store Connect 选择器组件,使用户体验尽可能熟悉,并在本文中,将展示如何使用 SwiftUI 为 macOS 构建了这个组件。...创建选择器组件让我们分析一下,我们有一组想要在 SwiftUI 列表显示构建。每个构建都包含一组属性,其中之一是 betaGroups,它是一个表示构建所属测试群组结构体数组。...使用 .overlay 修改器在用户悬停在测试群组组件上时显示一个移除按钮。该按钮从构建所属测试群组列表移除测试群组。...以上代码片段使用了 BetaGroup 结构体上一个名为 displayName 属性来显示测试群组名称,类似于在 App Store Connect 显示方式,显示名称前两个单词首字母大写...总结文章介绍了如何使用 SwiftUI为macOS 创建类似于 App Store Connect 选择器组件。

    19232

    AnyView 对 SwiftUI 性能影响

    前言AnyView 是一种类型擦除视图,对于 SwiftUI 容器包含异构视图非常方便。在这些情况下,你不需要指定视图层次结构中所有视图具体类型。...如果是 AnyView(基本上是一个包装类型),SwiftUI 将很难确定视图身份和结构,并且它将重新绘制整个视图,这并不是真正高效。...你可以在这个出色 WWDC 演讲中找到有关 SwiftUI 差异机制更多细节。Apple 也多次提到,我们应该避免在 ForEach使用 AnyView,称其可能会导致性能问题。...为了更好地理解结果,我们需要深入了解 SwiftUI 工作原理。在这个关于 SwiftUI 性能 WWDC 会话,来自 SwiftUI 团队 Raj 讨论了列表或表需要提前知道所有标识符。...总结总而言之,在这些情景(包含异构视图可滚动列表),最好为容器不同视图使用具体类型。这可能听起来更复杂一些,但实际上你可以使其更简单,而不必过多地处理泛型。

    14100

    SwiftUI 实现 3D Scroll 效果

    我们预览下今天要实现 3D scroll 效果。学完本教程后,你就可以在你 App 把这种 3D 效果加入任何自定义 SwiftUI 视图。下面我们来开始本教程学习。...入门 首先,创建一个新 SwiftUI 视图。为了举例说明,在这个新视图中,我会展示一个有各种颜色矩形列表,并把新视图命名为 ColorList。...) { HStack(alignment: .center, spacing: 50) { } } } 展示矩形 我们使用 ForEach 在 HStack....frame(width: 200, height: 300, alignment: .center) } } } } 在 Preview 结构传入如下颜色参数...axis 参数是一个元组类型,它定义了在使用你传入角度参数时,哪一个坐标轴要发生改变。在本例,是 Y 轴。 rotation3DEffect() 方法文档可以在苹果官方网站 这里 找到。

    1.5K20

    肘子 Swift 周报 | Swift,超越苹果生态!

    Aryaman Sharda 在本文中深入探讨了 ABI 稳定性与库进化模式,并通过实例详细说明了 @frozen 关键字在枚举结构应用。...文章不仅阐述了这一概念实现过程,还附带了一个完整演示,展现了如何在 SwiftUI 环境下应用这一技术。...在这篇文章,Hina Khan 展示了如何使用 Playgrounds 进行图像处理,创造出既动态又吸引人视觉效果。...在转向 AppKit 过程,他探讨了一些鲜为人知 AppKit 组件, NSTableHeaderCell 等,并通过 NSViewRepresentable构建了 SwiftUI 与 AppKit...实际上,该应用复杂模板编辑器几乎完全使用 SwiftUI 开发,且表现出色。这一点彰显了 SwiftUI 在实际应用强大潜力和灵活性。

    14410

    Ask Apple 2022 与 SwiftUI 有关问答(下)

    在更复杂 UI ,由于视图更新速度过快,性能( 至少在 macOS 上 )迅速下降。A:有不同策略。ObservableObject 是使视图或视图层次结构失效( 引发重新计算 )单元。...Swiftcord[12] 代码展示了如何在 SwiftUI 下实现倒置列表。阅读 优化在 SwiftUI List 显示大数据集响应效率[13] 一文,了解苹果工程师推荐方法。...在 SwiftUI 4 ,可以使用 .scrollContentBackground(.hidden) 隐藏列表默认背景searchableQ:是否有办法在.searchable() 修饰器以编程方式设置搜索字段焦点...macOS APIQ:对于运行 Monterey Mac,能否如何在 SwiftUI 实现下面需求建议:打开一个窗口在该窗口中初始化数据找到所有打开窗口确定一个窗口是否打开从不在该窗口视图中关闭一个窗口...当视图结构过于复杂时,除了难以阅读外,还会出现无法使用代码自动补全以及上文提到无法编译( too complex to type check )情况。

    14.8K30

    只在视图 Body 中生存变量

    但很少有人会在 body 中去使用 var 来定义变量,因为实在找不到使用 var 理由和意义。本文将探讨在 SwiftUI 视图 body 中用 var 来创建变量意义和可能场景。...不过就和通过 let _ = print("update") 能够帮助我们了解视图动态一样,掌握了在 body 通过 var 创建变量及应用方法,也将有助于开发者更好地理解 SwiftUI 视图求值逻辑并掌握其时机...,通常会使用将 FetchResults 进行枚举化再转成数组方式来处理: struct ContentView: View { @Environment(\.managedObjectContext...在 SwiftUI 所有的惰性容器,都会出现计算两次情况( 或许与惰性容器视图值保存机制有关 ),这就要求我们为了得到正确 offset 值必须进行除 2 操作。...这并不意味着我推荐本节介绍方法,在日常使用,除非真的出现了不可调和性能问题,enumerated 仍是最符合直觉解决之道。

    68810

    SwiftUI 与 Core Data —— 数据定义

    在上文中,我列举了一些在 SwiftUI使用 Core Data 所遇到困惑及期许。...在今后文章我们将尝试用新思路来创建一个 SwiftUI + Core Data app,看看能否避免并改善之前一些问题。本文将首先探讨如何定义数据。...遗憾是,托管对象对于以值类型为主 SwiftUI 来说并不算友好,因此,不少开发者都会在视图中将托管对象实例转换成一个结构体实例以方便接下来操作( 如何在 Xcode 下预览含有 Core Data...或添加计算属性 )方式改善托管对象类型兼容度定义方便在 SwiftUI 环境中使用结构,并为托管对象创建扩展方法以实现转换struct TodoGroup { var title: String...我们将介绍如何在视图从 Core Data 获取数据操作这一过程实现与托管环境解耦,创建一个可以接受 Mock 数据自定义 FetchRequest 类型。

    2.4K40
    领券