Swift Academy · レッスン

ミューテーティングメソッドとコピーオンライトのセマンティクス

なぜmutatingが必要なのか、SwiftのCOW最適化がどのように機能するのかを学びます。

レッスン 4/412 ステップ

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

ようこそ

格納プロパティを変更する構造体のメソッドには、`mutating` を付ける必要があります。Swift は値セマンティクスを効率的にするために、コピーオンライト(COW)も使用します。

mutating キーワード

```swift struct Counter { var count = 0 mutating func increment() { count += 1 } mutating func reset() { count = 0 } } var c = Counter() c.increment() // count = 1 ``` `mutating` がない場合、`self` を変更するメソッドはコンパイラによって拒否されます。

mutating が必要な理由

構造体は値型です。構造体を渡すと、*コピー* が渡されます。メソッドが元の値を変更することをコンパイラに知らせるために、`mutating` が必要です。 ```swift let c = Counter() c.increment() // ❌ cannot use mutating on let ```

mutating での self の再代入

`mutating` メソッドでは、`self` 全体を置き換えることができます。 ```swift struct Toggle { var isOn: Bool mutating func flip() { self = Toggle(isOn: !isOn) } } ```

値セマンティクス: コピーの動作

```swift var a = Counter() var b = a // b is an independent copy a.increment() print(a.count) // 1 print(b.count) // 0 — unaffected ``` 構造体を代入すると、すべての格納プロパティがコピーされます。

コピーオンライト(COW)

Swift 組み込みのコレクション(Array、Dictionary、Set、String)は COW を使用します。 ```swift var a = [1,2,3] var b = a // no copy yet — shared storage b.append(4) // NOW a copy is made — a is unchanged print(a) // [1,2,3] print(b) // [1,2,3,4] ```

COW が重要な理由

COW がなければ、構造体を代入するたびにすべての内容がディープコピーされます。COW によって、変更が実際のコピーを発生させるまでは、コピーは低コスト(参照カウントを増やすだけ)になります。これにより、ほとんどの状況で値型を参照型と同等の速度で扱えます。

カスタム COW の実装

```swift struct Buffer { private var storage: NSMutableData private mutating func ensureUnique() { if !isKnownUniquelyReferenced(&storage) { storage = storage.mutableCopy() as! NSMutableData } } mutating func append(_ byte: UInt8) { ensureUnique() // safe to mutate storage now } } ```

mutating とプロトコル

変更を行うプロトコルメソッドには、プロトコル内で `mutating` を付ける必要があります。 ```swift protocol Resettable { mutating func reset() } struct Counter: Resettable { var count = 0 mutating func reset() { count = 0 } } ``` このプロトコルを実装するクラスには `mutating` は必要ありません(クラスは参照型であるためです)。

`let` で保持する構造体は完全に不変

```swift let pt = Point(x: 1, y: 2) pt.x = 3 // ❌ even though x is var inside Point ``` 構造体を `let` に格納すると、その格納プロパティはいずれも変更できません。

確認問題

Swift のコピーオンライトは、実際にはいつコピーを実行しますか?

まとめ

主なポイント: • `mutating` は構造体のプロパティを変更するメソッドを示します • `let` の構造体に対して `mutating` メソッドを呼び出すことはできません • 代入によって構造体がコピーされます。COW により、コレクションではこの処理が低コストになります • COW は最初の変更時にのみ実際のコピーを作成します • `isKnownUniquelyReferenced` を使ってカスタム COW を実装できます コース完了です!次は、クラスの継承です。
無料で開始

AI チューターと学ぶ Swift — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
122
レッスン
409

よくある質問

「ミューテーティングメソッドとコピーオンライトのセマンティクス」レッスンは無料ですか?

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

「ミューテーティングメソッドとコピーオンライトのセマンティクス」で何を学びますか?

なぜmutatingが必要なのか、SwiftのCOW最適化がどのように機能するのかを学びます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「ミューテーティングメソッドとコピーオンライトのセマンティクス」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. メンバー単位のイニシャライザとカスタムイニット
  2. 格納プロパティとプロパティオブザーバー
  3. 構造体の計算プロパティ
  4. ミューテーティングメソッドとコピーオンライトのセマンティクス
← Swift Academyに戻る