0Pricing
Swift Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 值类型与不可变性
  2. mutating 关键字
  3. mutating 与 self 重新赋值
  4. 非变更式替代方案
← 返回 Swift Academy