0Pricing
Swift Academy · レッスン

クロージャのキャプチャリストと[weak self]

キャプチャリストを使い、クロージャがオブジェクトを強参照するのを防ぎます。

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

ようこそ

クロージャは、周囲のスコープにある変数をキャプチャします。キャプチャリスト(`[weak self]`、`[unowned self]`、`[value]`)を使うと、キャプチャ方法を正確に制御できます。

デフォルトの強キャプチャ

```swift var name = "Alice" let greet = { print("Hello, \(name)") } name = "Bob" greet() // "Hello, Bob" — closure sees current value ``` クロージャはデフォルトで、変数への*参照*をキャプチャします。

キャプチャリストの基本

```swift var count = 10 let snapshot = { [count] in print(count) } // captures value count = 99 snapshot() // 10 — snapshot of count at capture time ``` `[]`内に値型を指定すると、クロージャが作成された時点の値がコピーされます。

[weak self]パターン

```swift class API { func fetch(completion: @escaping () -> Void) { ... } } class VC { func load() { api.fetch { [weak self] in guard let self else { return } // self might be nil by now self.updateUI() } } } ```

拡張ライフタイムを使ったguard let self

Swift 5.3以降では、shadowを作らずにguard内で`self`を再束縛できます: ```swift { [weak self] in guard let self else { return } // 'self' is now strong within this block doA() doB() doC() } ```

[unowned self]が安全な場合

```swift button.addTarget(self, action: #selector(tap), for: .touchUpInside) // If the button's closure is guaranteed not to outlive self: let action: () -> Void = { [unowned self] in self.handleTap() } ```

複数の値のキャプチャ

```swift let base = 100 let multiplier = 2 let compute = { [base, multiplier] in base * multiplier } print(compute()) // 200 ``` 同じリスト内に複数の値をカンマ区切りで指定してキャプチャできます。

名前付き束縛を使ったキャプチャリスト

```swift let myService = service // rename in capture list: let handler = { [service = myService] in service.process() } ``` 特定の時点の値を新しい名前でキャプチャする場合に便利です。

EscapingとNon-Escaping

• `@escaping`クロージャは保存して、関数の戻り値が返された後に呼び出せます → 循環参照のリスクがあります • Non-escapingクロージャは関数の戻り値が返される前に呼び出されます → 循環参照のリスクはありません ```swift func apply(_ f: () -> Void) { f() } // non-escaping, no [weak] needed func later(_ f: @escaping () -> Void) { queue.async { f() } } // escaping ```

キャプチャの問題をデバッグする

循環参照が疑われる場合: 1. クラスに`deinit { print("deallocated") }`を追加します 2. 画面を移動するか、インスタンスをnilに設定します 3. deinitの出力がなければ → 循環参照が存在します 次に、そのクラスのクロージャへ`[weak self]`を追加します。

理解度チェック

キャプチャリスト内の`[weak self]`は何をしますか?

まとめ

重要なポイント: • クロージャはデフォルトで参照をキャプチャします • キャプチャリストの`[value]`は、作成時点で値型をコピーします • `[weak self]` — 保持せず、自動的にnilになり、`guard let self`と組み合わせて使用します • `[unowned self]` — 保持せず、nilを安全に扱えません • `@escaping`クロージャではキャプチャリストが必要ですが、Non-escapingクロージャでは通常必要ありません コース完了です!次はSwiftの関数型プログラミングです。

よくある質問

「クロージャのキャプチャリストと[weak self]」レッスンは無料ですか?

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

「クロージャのキャプチャリストと[weak self]」で何を学びますか?

キャプチャリストを使い、クロージャがオブジェクトを強参照するのを防ぎます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「クロージャのキャプチャリストと[weak self]」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. ARCが参照を数える仕組み
  2. 保持サイクル:原因と検出
  3. weakとunownedの参照
  4. クロージャのキャプチャリストと[weak self]
← Swift Academyに戻る