0Pricing
Swift Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 値型と不変性
  2. mutatingキーワード
  3. mutatingとselfの再代入
  4. 非変更の代替手段
← Swift Academyに戻る