SwiftUI中如何获取Car结构体首尾为true的月份并显示
提取Car实例中首尾激活月份的实现方案
问题需求
从Car实例中筛选出第一个和最后一个值为true的月份,将其格式化为首字母大写的名称后显示在Text组件中。
解决思路
- 为
Car结构体添加有序的月份映射列表,确保月份按1-12月的自然顺序排列,同时关联对应的布尔值和首字母大写的月份名称。 - 通过计算属性过滤出所有激活(值为
true)的月份名称,直接得到有序的有效月份数组。 - 在视图中直接取该数组的
first和last元素,即可得到首尾激活月份,同时处理无激活月份的边界情况。
完整代码实现
import SwiftUI struct Car: Identifiable { let id = UUID() let name: String let january: Bool, february: Bool, march: Bool, april: Bool, may: Bool, june: Bool let july: Bool, august: Bool, september: Bool, october: Bool, november: Bool, december: Bool // 按顺序定义月份名称与对应激活状态 private var monthPairs: [(name: String, isActive: Bool)] { [ ("January", january), ("February", february), ("March", march), ("April", april), ("May", may), ("June", june), ("July", july), ("August", august), ("September", september), ("October", october), ("November", november), ("December", december) ] } // 计算属性:获取所有激活的月份名称(按顺序) var activeMonthNames: [String] { monthPairs.filter { $0.isActive }.map { $0.name } } } let cars = [ Car(name: "Peugeot 208", january: false, february: false, march: false, april: false, may: true, june: true, july: true, august: true, september: false, october: false, november: false, december: false), Car(name: "Dacia Sandero", january: false, february: false, march: true, april: true, may: false, june: false, july: false, august: false, september: false, october: false, november: false, december: false) ] struct ContentView: View { var body: some View { VStack(spacing: 12) { ForEach(cars.sorted { $0.name < $1.name }) { car in VStack(alignment: .leading) { Text(car.name) .font(.headline) // 处理无激活月份的情况 if car.activeMonthNames.isEmpty { Text("No active months") .foregroundColor(.gray) } else { Text("From \(car.activeMonthNames.first!) to \(car.activeMonthNames.last!)") } } } } .padding() } } // 预览 struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
代码说明
monthPairs:按自然顺序存储月份名称(首字母大写)和对应的激活状态,确保遍历顺序与实际月份顺序一致。activeMonthNames:通过过滤和映射,直接得到有序的激活月份名称数组,无需额外排序。- 视图中增加空值判断,避免无激活月份时出现空字符串显示,提升界面友好性。
内容的提问来源于stack exchange,提问作者Alexnnd
相关产品推荐
相关产品推荐

