DevCN
菜单
全部文章快讯开发深度热点

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 依然不变。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。