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

SwiftUI TodoApp报错:无法修改let常量'quest'的done属性

解决SwiftUI TodoApp中任务状态修改的错误

错误原因

出现Cannot assign to property: 'quest' is a 'let' constant的核心问题有三点:

  • 遍历List时,quest是结构体的不可变副本(默认是let常量),无法直接修改其属性
  • quests是普通数组,不是SwiftUI的状态变量,就算能修改也无法触发视图更新
  • 你当前用的独立done变量和每个任务的状态无关,图标显示逻辑完全错误

修复步骤

  1. 将任务数组转为状态变量:用@State包装quests,让SwiftUI能追踪数组变化并自动更新视图
  2. 通过绑定修改任务状态:遍历数组时使用绑定语法,直接修改任务的状态属性,无需手动处理索引
  3. 修正图标显示逻辑:用每个quest自己的done属性判断图标样式,废弃独立的done变量
  4. 优化状态切换逻辑:改为切换任务的完成状态(而非强制设为true),更符合TodoApp的使用逻辑

修改后的完整代码

import SwiftUI

struct Quest: Identifiable{
    var title: String
    var done: Bool
    var id: String { title }
}

struct ContentView: View {
    // 用@State包装数组,让SwiftUI追踪数据变化
    @State private var quests: [Quest] = [
        Quest(title: "整理房间", done: true),
        Quest(title: "倒垃圾", done: false),
        Quest(title: "打扫浴室", done: false)
    ]
        
    var body: some View {
        VStack{
            // 使用$quests获取绑定,直接拿到可修改的quest实例
            List($quests) { $quest in
                Button {
                    // 切换任务的完成状态
                    quest.done.toggle()
                } label: {
                    HStack{
                        // 根据当前任务的done属性显示对应UI
                        if quest.done {
                            Image(systemName: "checkmark.circle.fill")
                                .foregroundColor(Color("checked"))
                            Text(quest.title)
                                .foregroundColor(.gray)

                        } else {
                            Image(systemName: "checkmark.circle")
                                .foregroundColor(.gray)
                            Text(quest.title)
                                .foregroundColor(.black)

                        }
                    }
                }
            }
        }
    }
}

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

关键说明

  • List($quests)会自动为每个任务生成绑定($quest),修改quest.done时会同步更新原数组,同时触发视图刷新
  • toggle()方法实现了点击任务切换完成/未完成状态的功能,比强制设为true更实用
  • 移除了无用的独立done变量,直接依赖任务自身的状态控制UI显示,逻辑更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:07:11