mutating 与 self 重新赋值
在 mutating 方法中完整替换 self。
mutating 与 self 重新赋值 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
重新赋值给实例自身
在 mutating 方法中,您可以将一个全新的值赋给 self,从而替换整个实例。
struct Point {
var x = 0
var y = 0
mutating func reset() {
self = Point(x: 0, y: 0)
}
}
var p = Point(x: 3, y: 4)
p.reset()
print(p.x, p.y)为什么要重新赋值给实例自身
当新状态用一个全新实例来表达比逐个编辑字段更简单时,重新赋值给 self 会非常方便。
struct Vector {
var dx: Int
var dy: Int
mutating func negate() {
self = Vector(dx: -dx, dy: -dy)
}
}
var v = Vector(dx: 2, dy: -3)
v.negate()
print(v.dx, v.dy)枚举重新赋值给实例自身
对于枚举,可以通过将新情况赋给 self 来切换情况。
enum State {
case idle, running, done
mutating func advance() {
switch self {
case .idle: self = .running
case .running: self = .done
case .done: self = .done
}
}
}
var s = State.idle
s.advance()
s.advance()
print(s)等同于逐个编辑字段
赋值 self = Point(x: 1, y: 1) 等同于分别设置 x 和 y,只是写法更加简洁。
struct Point {
var x = 0
var y = 0
mutating func setBoth(_ n: Int) {
self = Point(x: n, y: n)
}
}
var p = Point()
p.setBoth(7)
print(p.x, p.y)先读取旧的实例自身
您可以先根据当前实例计算出新实例,然后再重新赋值。
struct Counter {
var value: Int
mutating func doubled() {
self = Counter(value: value * 2)
}
}
var c = Counter(value: 5)
c.doubled()
print(c.value)构建器式转换
重新赋值给实例自身,可以让方法用一步操作表达完整的转换。
struct Temperature {
var celsius: Double
mutating func toRounded() {
self = Temperature(celsius: celsius.rounded())
}
}
var t = Temperature(celsius: 21.7)
t.toRounded()
print(t.celsius)仅限可变更方法
您只能在标记为 mutating 的方法中给 self 赋值。普通方法不能这样做。
struct Flag {
var on = false
mutating func turnOn() {
self = Flag(on: true)
}
}
var f = Flag()
f.turnOn()
print(f.on)结合逻辑
您可以进行分支判断,并仅在某些情况下重新赋值给 self。
struct Score {
var points: Int
mutating func clamp() {
if points > 100 {
self = Score(points: 100)
}
}
}
var s = Score(points: 150)
s.clamp()
print(s.points)枚举切换模式
两种情况的枚举切换,是重新赋值给实例自身的经典示例。
enum Switch {
case off, on
mutating func flip() {
self = (self == .off) ? .on : .off
}
}
var sw = Switch.off
sw.flip()
print(sw)不影响其他副本
重新赋值给 self 只会更改当前实例,值的其他副本不会受到影响。
struct Box { var n: Int; mutating func zero() { self = Box(n: 0) } }
var a = Box(n: 5)
var b = a
a.zero()
print(a.n, b.n)意图清晰
当重新赋值给实例自身能让转换过程一目了然时,请使用这种方式;如果只更改一个属性,请直接编辑该字段。
struct Pair {
var a: Int
var b: Int
mutating func swapValues() {
self = Pair(a: b, b: a)
}
}
var p = Pair(a: 1, b: 2)
p.swapValues()
print(p.a, p.b)快速检查
测试重新赋值给实例自身。
回顾
在 mutating 方法中,您可以将一个全新的值赋给 self,从而替换整个实例。这种方式适合表达完整转换,枚举也通过它来切换情况。它只影响当前实例,不会影响其他副本。
enum T { case a, b; mutating func go() { self = .b } }
var t = T.a
t.go()
print(t)常见问题解答
「mutating 与 self 重新赋值」课时是免费的吗?
是的 — 「mutating 与 self 重新赋值」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「mutating 与 self 重新赋值」这节课中我会学到什么?
在 mutating 方法中完整替换 self。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「mutating 与 self 重新赋值」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 值类型与不可变性
- mutating 关键字
- mutating 与 self 重新赋值
- 非变更式替代方案