mutatingとselfの再代入
mutatingメソッドからself全体を置き換えます。
「mutatingとselfの再代入」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
self の再代入
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 を再代入する理由
新しい状態をフィールドごとに編集するよりも、新しいインスタンスとして表すほうが簡単な場合、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)enum での self の再代入
enum では、新しいケースを 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)先に古い self を読み取る
再代入する前に、現在のインスタンスから新しいインスタンスを計算できます。
struct Counter {
var value: Int
mutating func doubled() {
self = Counter(value: value * 2)
}
}
var c = Counter(value: 5)
c.doubled()
print(c.value)ビルダースタイルの変換
self を再代入すると、完全な変換をメソッド内の1つのステップで表現できます。
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 に代入できるのは、mutating とマークされたメソッド内だけです。通常のメソッドでは代入できません。
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 の切り替えパターン
2つのケースを持つ enum の切り替えは、self の再代入の典型的な例です。
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)意図を読みやすく表す
変換の内容が明確になる場合は self の再代入を使い、1つのプロパティだけを変更する場合はフィールドを編集します。
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)クイックチェック
self の再代入を確認しましょう。
まとめ
mutating メソッド内では、新しい値全体を self に代入して、インスタンスを置き換えることができます。完全な変換を簡潔に表現でき、enum のケース切り替えにも使われます。影響を受けるのはこのインスタンスだけで、他のコピーには影響しません。
enum T { case a, b; mutating func go() { self = .b } }
var t = T.a
t.go()
print(t)よくある質問
「mutatingとselfの再代入」レッスンは無料ですか?
はい。「mutatingとselfの再代入」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「mutatingとselfの再代入」で何を学びますか?
mutatingメソッドからself全体を置き換えます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「mutatingとselfの再代入」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 値型と不変性
- mutatingキーワード
- mutatingとselfの再代入
- 非変更の代替手段