0Pricing
Swift Academy · レッスン

weakとunownedの参照

サイクルを解消するため、weak(Optional)とunowned(非Optional)を使い分けます。

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

ようこそ

循環参照を解消するには、ARCのカウントを増加させない参照が必要です。Swiftには2種類あります。`weak`(Optionalで、自動的にnilになります)と`unowned`(非Optionalで、nilの場合は安全ではありません)です。

weak参照

```swift class Owner { var pet: Pet? } class Pet { weak var owner: Owner? } // does not retain var o: Owner? = Owner() var p: Pet? = Pet() o?.pet = p p?.owner = o o = nil // Owner deinit — p.owner becomes nil automatically ```

weakは常にOptional

```swift class View { weak var delegate: ViewDelegate? } ``` `weak`は`var`かつOptionalでなければなりません。参照先のオブジェクトが解放されると、Swiftが自動的にnilにします。

unowned参照

```swift class Customer { var card: CreditCard? } class CreditCard { unowned let customer: Customer // card always has a customer init(customer: Customer) { self.customer = customer } } ``` `unowned`は保持を行わず、非Optionalです。参照先のオブジェクトがこのオブジェクトより長く存続することを保証します。

weakとunownedの選び方

| 状況 | 使用するもの | |---|---| | 参照先のオブジェクトがnilになる可能性がある | `weak` | | 参照先のオブジェクトが常にこのオブジェクトより長く存続する | `unowned` | | 判断できない | `weak`(より安全) |

解放後のunownedへのアクセス

```swift var customer: Customer? = Customer() var card = CreditCard(customer: customer!) customer = nil print(card.customer.name) // 💥 crash — unowned is dangling ``` 参照先のオブジェクトが解放された後に、`unowned`へアクセスしてはいけません。

クロージャでの[weak self]

```swift class VC { func load() { api.fetch { [weak self] data in guard let self else { return } self.render(data) } } } ``` `[weak self]`は、Swiftで最も一般的な循環参照の解消方法です。

クロージャでの[unowned self]

```swift class Session { var onComplete: (() -> Void)? init() { onComplete = { [unowned self] in // self always outlives closure self.finish() } } } ``` クロージャが実行される時点で`self`がnilにならないと確信できる場合に限り、`[unowned self]`を使用してください。

nilへの自動置換の確認

```swift class Timer { weak var delegate: TimerDelegate? } var d: TimerDelegate? = ConcreteDelegate() let t = Timer() t.delegate = d d = nil print(t.delegate) // nil — automatically zeroed ```

Delegateパターンのベストプラクティス

delegateプロパティは必ず`weak`として宣言してください: ```swift protocol MyDelegate: AnyObject { func didUpdate() } class MyView { weak var delegate: MyDelegate? } ``` プロトコルで`weak`を使用するには、`AnyObject`制約が必要です。

理解度チェック

参照先のオブジェクトが解放されたとき、自動的に`nil`になる参照の種類はどれですか?

まとめ

重要なポイント: • `weak` — Optionalで、自動的にnilになり、安全です • `unowned` — 非Optionalで、参照先が長く存続することを前提とし、前提が崩れるとクラッシュします • Delegateパターン:`AnyObject`制約を付け、常に`weak var delegate: Protocol?`と宣言します • クロージャ:`[weak self]`が標準パターンで、内部では`guard let self`を使用します • 迷った場合は、`unowned`より`weak`を選びます 次は、クロージャのキャプチャリストです。

よくある質問

「weakとunownedの参照」レッスンは無料ですか?

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

「weakとunownedの参照」で何を学びますか?

サイクルを解消するため、weak(Optional)とunowned(非Optional)を使い分けます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「weakとunownedの参照」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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