Swift 结构体:通过值语义更新任务而不修改原值
使用结构体保存任务,复制后改变完成状态,观察原值保持不变,并理解 let、var 与值类型的配合。
本节目标
使用结构体保存任务,复制后改变完成状态,观察原值保持不变,并理解 let、var 与值类型的配合。
环境与运行方法
准备 Swift 6 工具链。保存为 lesson.swift,执行 swiftc lesson.swift -o lesson 后运行 ./lesson。示例在命令行运行,不依赖 UIKit 或 SwiftUI。
核心思路
结构体是值类型,赋值产生独立的值语义。原记录用 let 固定,新记录用 var 允许修改。这个模型适合观察状态变化,而不是让多个地方随意共享一个可变对象。
完整示例
struct Task {
let title: String
let minutes: Int
var done: Bool
}
let original = Task(title: "review", minutes: 30, done: false)
var updated = original
updated.done = true
print("original=\(original.done)")
print("updated=\(updated.done)")
let total = [original, updated].filter { $0.done }.reduce(0) { $0 + $1.minutes }
print("total=\(total)")预期输出
original=false
updated=true
total=30逐步理解
updated 的 done 被修改,original 仍保持 false。集合里只有更新后的值满足筛选,因此总时长为 30。这里并列两个版本仅用于教学,业务统计中要避免把历史版本当成额外任务。
结构体如果包含类引用,复制外层结构体不会让被引用对象也自动独立。值语义与内部引用关系要一起分析。let 的结构体不能改变 var 成员,因为整个值被固定。
常见问题与边界
- 结构体中包含引用类型时仍需理解共享对象。
- 不能修改 let 绑定结构体的可变成员。
- 历史与当前版本应有明确存储边界。
动手练习
把 updated 改成 let,再尝试完成任务。
参考答案
编译器应拒绝修改,因为 updated 整个值不可变。恢复 var 后才可以更新 done,原 original 依然不变。
文章回复
0 条公开回复