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

SwiftUI 5中ForEach嵌套If出现类型错误求助

问题修复方案

错误原因分析

  1. 外层ForEach($days)误用绑定数组:我们仅需展示固定日期列表,不需要双向绑定days,这导致循环变量day变成Binding<String>类型,引发后续类型不匹配错误。
  2. 内层训练项遍历逻辑错误:原代码用days.contains(routine.Day)判断,仅检查训练项日期是否在数组中(永远为真),而非匹配当前遍历的日期;同时因外层绑定的影响,days在闭包内被识别为绑定类型,导致类型兼容问题。
  3. 内层ForEach未指定唯一标识:若Routines结构体未遵循Identifiable协议,必须显式声明id参数,否则SwiftUI无法区分列表项。

修复后的完整代码

import SwiftUI
import SQLite3

// 确保Routines结构体遵循Identifiable协议(若未实现)
struct Routines: Identifiable {
    let id: Int // 可复用ExerciseID作为唯一标识
    let Exercise: Int // 关联exercise表的ExerciseID
    let Day: String
    let Name: String
}

struct YourRoutines: View 
{
    // 固定日期列表无需状态管理,改为普通常量
    let days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
    
    @ObservedObject var routinedatabase: RoutineDatabase
    @ObservedObject var exercisedatabase: ExercisesDatabase
    
    var body: some View
    {
        ZStack
        {
            Rectangle()
                .foregroundColor(Color(.clear))
                .frame(maxWidth: .infinity, maxHeight: .infinity)
                .edgesIgnoringSafeArea(.all)
            Rectangle()
                .frame(width: 380, height: 600, alignment: .center)
                .foregroundColor(Color("Orange"))
                .cornerRadius(15)
                .shadow(radius: 15)
            
            VStack
            {
                Text("Your Routine")
                    .foregroundColor(.white)
                    .font(.title)
                    .fontWeight(.bold)
                    .padding(.bottom, 10)
                
                // 遍历普通日期数组,循环变量为String类型
                ForEach(days, id: \.self) { day in
                    VStack(alignment: .leading) {
                        Text(day)
                            .font(.headline)
                            .padding(.bottom, 5)
                        
                        // 先过滤当前日期的训练项,再遍历展示
                        ForEach(routinedatabase.routineList.filter { $0.Day == day }, id: \.id) { routine in
                            Text(routine.Name)
                                .padding(.vertical, 2)
                        }
                    }
                    .padding(.horizontal)
                }
                .padding()
                .background(Color("Orange"))
                .cornerRadius(15)
            }
            .navigationTitle("Your Routines")
        }
    }
}

关键修改点

  • 移除days的@State修饰:日期列表固定不变,无需状态管理。
  • 外层ForEach改为遍历普通数组:直接使用ForEach(days, id: \.self),循环变量day为String类型,无需调用wrappedValue。
  • 内层ForEach添加日期过滤:通过filter { $0.Day == day }仅展示当前日期的训练项,同时显式指定id: \.id(依赖Routines遵循Identifiable)。
  • 优化VStack对齐:设置alignment: .leading让训练项与日期标题左对齐,提升视觉一致性。

内容的提问来源于stack exchange,提问作者fernando_gdv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:25:57