0Pricing
Swift Academy · レッスン

キャプチャリスト — weak/unownedと値のキャプチャ

キャプチャリストで、クロージャが参照や値をどのようにキャプチャするかを制御します。[weak self]、unowned、値のスナップショットを使い、循環参照や見つけにくいバグを防ぎます。

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

キャプチャリストを使う理由

目標: クロージャが何を、そしてどのようにキャプチャするかを制御します。[weak self]またはunownedを使って参照サイクルを避け、必要に応じて値のスナップショットをキャプチャします。

強いキャプチャ = 循環のリスク

エスケープするクロージャや保存されたクロージャは、キャプチャした値をretainします。ここでselfを強くキャプチャすると、参照サイクルが発生する可能性があります。

class Owner {
    var name = "Owner"
    var onDone: (() -> Void)?

    func start() {
        // Strong capture of self can cause a cycle if onDone is stored:
        onDone = {
            print("Done by", self.name) // self captured strongly
        }
    }
}
var o: Owner? = Owner()
o?.start()
// If nothing nils onDone or o, both can keep each other alive.

弱いキャプチャのパターン

[weak self]を使用して参照サイクルを断ち切ります。内部のselfはオプショナルになるため、guard letまたはオプショナルチェーンでアンラップします。

class Owner2 {
    var name = "Owner2"
    var onDone: (() -> Void)?

    func start() {
        onDone = { [weak self] in
            guard let self = self else { return }  // safely unwrap optional self
            print("Done by", self.name)
        }
    }
}
let o2 = Owner2()
o2.start()
o2.onDone?()

unowned(慎重に使用)

unownedは、selfがクロージャより長く存続することを前提とします(非オプショナル)。呼び出し時にnilにならないと確信できる場合だけ使用します。

class Owner3 {
    var onDone: (() -> Void)?
    func work() {
        onDone = { [unowned self] in
            // self must be alive when this runs; otherwise crash
            print("Owner3 still alive")
        }
    }
}
let o3 = Owner3()
o3.work()
o3.onDone?()

値のスナップショットという考え方

キャプチャリストでは値のスナップショットを作成できます(例: [n = count])。リストがなくても、内部のlet定数は作成時にキャプチャされます。

var count = 0
let makeLogger: () -> () -> Void = {
    let snapshot = count     // captured by value at creation
    return {
        print("snapshot =", snapshot, "current =", count)
    }
}
count = 10
let logger = makeLogger()
count = 20
logger()   // snapshot = 10, current = 20

キャプチャリストでの値の束縛

キャプチャリストを使用すると、クロージャの作成時に名前付きの値のスナップショットを作成できます(例: [initial = total])。

var total = 5
let closure = { [initial = total] in
    print("initial:", initial, " now:", total)
}
total = 9
closure()   // initial uses captured value 5

weak selfを使う理由

確認: 保存されたクロージャやエスケープするクロージャに[weak self]を追加するのはなぜですか?

まとめ

まとめ: 参照サイクルを断ち切るには[weak self]を使用します(selfはオプショナルになります)。unownedは存続期間が保証される場合だけ使用し、キャプチャリストの束縛で値のスナップショットをキャプチャします。

よくある質問

「キャプチャリスト — weak/unownedと値のキャプチャ」レッスンは無料ですか?

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

「キャプチャリスト — weak/unownedと値のキャプチャ」で何を学びますか?

キャプチャリストで、クロージャが参照や値をどのようにキャプチャするかを制御します。[weak self]、unowned、値のスナップショットを使い、循環参照や見つけにくいバグを防ぎます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「キャプチャリスト — weak/unownedと値のキャプチャ」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. クロージャとキャプチャの基本
  2. キャプチャリスト — weak/unownedと値のキャプチャ
  3. escapingとnon-escaping、autoclosure
← Swift Academyに戻る