0Pricing
Swift Academy · レッスン

変更、共有、予期しないエイリアシング

共有参照によってバグが生じる仕組みと、値型でそれを防ぐ方法を学びます。

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

ようこそ

エイリアシングとは、2つの変数が同じオブジェクトを参照する状態です。値型では発生しませんが、参照型では予想外のバグにつながります。この違いを理解することが重要です。

値型ではエイリアシングが発生しない

```swift var a = [1,2,3] var b = a // independent copy a.append(4) print(b) // [1,2,3] — unchanged ``` 値型を代入するたびに、独立したコピーが作成されます。

参照型ではエイリアシングが発生する

```swift class Counter { var value = 0 } let a = Counter() let b = a // SAME object a.value += 1 print(b.value) // 1 — b sees the change! ``` `a` と `b` は、どちらも同じヒープオブジェクトを指します。

関数パラメーターでのエイリアシング

```swift func increment(_ c: Counter) { c.value += 1 } let shared = Counter() increment(shared) print(shared.value) // 1 — mutated by the function ``` クラスは参照によって渡されるため、関数は元のオブジェクトを変更します。

問題点: 共有される可変状態

```swift class Cache { var items: [String] = [] } var cache = Cache() var cache2 = cache // aliased! cache.items.append("data") print(cache2.items) // ["data"] — unexpected! ``` これにより、一見無関係なコードの部分同士が互いに影響するようになります。

値型による解決

```swift struct Cache { var items: [String] = [] } var cache = Cache() var cache2 = cache // independent copy cache.items.append("data") print(cache2.items) // [] — unaffected ```

コピーを行うクラスによる解決

```swift func process(_ c: Counter) { var local = Counter() local.value = c.value // copy values, not reference local.value += 1 } ``` 参照セマンティクスが必要でもエイリアシングは避けたい場合は、値を明示的にコピーします。

スレッド安全性とエイリアシング

エイリアシングは、スレッド間では特に危険になります: ```swift // Thread 1: cache.items.append("a") // Thread 2 simultaneously: cache.items.append("b") // ❌ data race! ``` Swift Concurrency の値型はデフォルトでこれを防ぎます。可変状態を共有できるのはアクターだけです。

意図しないエイリアシングの検出

Xcode の Thread Sanitizer(TSan)は、実行時にデータ競合を検出します。Scheme > Diagnostics > Thread Sanitizer で有効にしてください。 Swift Exclusivity Enforcement は、`inout` パラメーターに関する単一スレッド内のエイリアシング違反を実行時に検出します。

意図的なエイリアシングパターン

エイリアシングが意図的な場合もあります。たとえば、グローバルキャッシュです: ```swift class AppCache { static let shared = AppCache() // intentional shared reference var data: [String: Any] = [:] } ``` 意図的な共有であることを明確に文書化し、デフォルトでは値型を使って意図しないエイリアシングを避けてください。

クイックチェック

クラスのインスタンスを新しい変数に代入すると、どうなりますか。

まとめ

重要なポイント: • 値型(struct)— 代入時にコピーされるため、エイリアシングは発生しません • 参照型(class)— 代入時に参照を共有するため、エイリアシングが発生する可能性があります • スレッド間のエイリアシング = データ競合 • デフォルトでは構造体を使い、共有アイデンティティが必要な場合にだけクラスを使ってください • TSan と Swift Exclusivity を使って問題を検出してください 次は、値型と参照型が混在するグラフです。

よくある質問

「変更、共有、予期しないエイリアシング」レッスンは無料ですか?

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

「変更、共有、予期しないエイリアシング」で何を学びますか?

共有参照によってバグが生じる仕組みと、値型でそれを防ぐ方法を学びます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「変更、共有、予期しないエイリアシング」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. スタックとヒープ:値が存在する場所
  2. 変更、共有、予期しないエイリアシング
  3. 値と参照が混在するグラフ
  4. 値セマンティクスに対応したAPI設計
← Swift Academyに戻る