0Pricing
Swift Academy · レッスン

mutatingキーワード

structやenumの状態を変更するメソッドを記述します。

「mutatingキーワード」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

メソッドはデフォルトでは変更できない

struct のインスタンスメソッドは、mutating とマークされていない限り、構造体の保存プロパティを変更できません。

struct Counter {
    var value = 0
    mutating func increment() {
        value += 1
    }
}
var c = Counter()
c.increment()
print(c.value)

mutating が必要な理由

struct は値型であるため、変更を明示するために、コンパイラは mutating の使用を明示的に選択するよう求めます。

struct Bank {
    var balance = 0
    mutating func deposit(_ amount: Int) {
        balance += amount
    }
}
var b = Bank()
b.deposit(50)
print(b.balance)

非 mutating メソッド

プロパティを読み取るだけのメソッドには、mutating は必要ありません。

struct Rectangle {
    var width = 0
    var height = 0
    func area() -> Int {
        return width * height
    }
}
let r = Rectangle(width: 3, height: 4)
print(r.area())

enum での mutating

enum にも、インスタンスを別のケースに切り替える mutating メソッドを定義できます。

enum Light {
    case on, off
    mutating func toggle() {
        self = (self == .on) ? .off : .on
    }
}
var l = Light.off
l.toggle()
print(l)

let では呼び出せない

定数(let)のインスタンスでは mutating メソッドを呼び出せません。呼び出すとコンパイルエラーになります。

struct Counter {
    var value = 0
    mutating func bump() { value += 1 }
}
var c = Counter()
c.bump()
// let d = Counter(); d.bump() // error
print(c.value)

複数のプロパティを変更する

1つの mutating メソッドで、複数のプロパティを同時に変更できます。

struct Player {
    var x = 0
    var y = 0
    mutating func move(dx: Int, dy: Int) {
        x += dx
        y += dy
    }
}
var p = Player()
p.move(dx: 3, dy: 5)
print(p.x, p.y)

値を返す mutating

mutating メソッドは、状態を変更しながら値を返すこともできます。

struct Stack {
    var items: [Int] = []
    mutating func pop() -> Int? {
        return items.popLast()
    }
}
var s = Stack(items: [1, 2, 3])
print(s.pop() ?? -1)
print(s.items)

標準ライブラリでの mutating

Array の append などのメソッドは mutating です。そのため、呼び出す配列には var が必要です。

var nums = [1, 2]
nums.append(3)
print(nums)

mutating と計算される状態

mutating メソッド内で派生状態を更新し、常に不変条件を保てます。

struct Wallet {
    var coins = 0
    var label = "empty"
    mutating func add(_ n: Int) {
        coins += n
        label = coins > 0 ? "has coins" : "empty"
    }
}
var w = Wallet()
w.add(5)
print(w.coins, w.label)

順序が重要

mutating メソッド内の文は上から下へ実行されるため、後の行では前の行による変更が反映されます。

struct Accumulator {
    var total = 0
    mutating func process() {
        total += 1
        total *= 10
    }
}
var a = Accumulator()
a.process()
print(a.total)

クラスに mutating は不要

参照型(class)は値型ではないため、キーワードを付けなくてもプロパティを変更できます。

class Box {
    var value = 0
    func bump() { value += 1 }
}
let box = Box()
box.bump()
print(box.value)

クイックチェック

mutating キーワードを確認しましょう。

まとめ

struct または enum のインスタンスメソッドが格納プロパティを変更する場合は、mutating を付けます。enum の場合は、ケースを切り替えるときにも付けます。このようなメソッドは let のインスタンスでは呼び出せません。クラスは参照型なので、mutating は必要ありません。

struct C { var v = 0; mutating func inc() { v += 1 } }
var c = C()
c.inc()
print(c.v)

よくある質問

「mutatingキーワード」レッスンは無料ですか?

はい。「mutatingキーワード」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「mutatingキーワード」で何を学びますか?

structやenumの状態を変更するメソッドを記述します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「mutatingキーワード」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

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