You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中如何获取Car结构体首尾为true的月份并显示

提取Car实例中首尾激活月份的实现方案

问题需求

从Car实例中筛选出第一个和最后一个值为true的月份,将其格式化为首字母大写的名称后显示在Text组件中。

解决思路

  1. 为Car结构体添加有序的月份映射列表,确保月份按1-12月的自然顺序排列,同时关联对应的布尔值和首字母大写的月份名称。
  2. 通过计算属性过滤出所有激活(值为true)的月份名称,直接得到有序的有效月份数组。
  3. 在视图中直接取该数组的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:17:48