0Pricing
Swift Academy · レッスン

オートクロージャ

@autoclosureで式の評価を遅延させます。

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

オートクロージャーとは

@autoclosureは引数の式を自動的にクロージャーでラップするため、関数が実際に利用するまで評価されません。呼び出し側はクロージャーではなく、通常の式を記述します。

オートクロージャーを使わない場合

通常、評価を遅延させるには、呼び出し側で明示的なクロージャーが必要です:

func logIf(_ cond: Bool, _ message: () -> String) {
    if cond { print(message()) }
}
logIf(true) { "expensive" }  // caller writes braces

オートクロージャーを使う場合

@autoclosureを使うと、呼び出し側は式をそのまま渡せます:

func logIf(_ cond: Bool, _ message: @autoclosure () -> String) {
    if cond { print(message()) }
}
logIf(true, "expensive")  // no braces, evaluated only if cond

遅延評価の確認

式はクロージャーが呼び出されたときにだけ実行されます:

func pick(_ cond: Bool, _ value: @autoclosure () -> Int) -> Int {
    cond ? value() : -1
}
func costly() -> Int { print("computed"); return 42 }
print(pick(false, costly()))  // -1  -- "computed" never prints

標準ライブラリでの使用例

&&演算子、||演算子、assert、??はすべてオートクロージャーを使うため、右辺は必要な場合にだけ評価されます。

?? のような短絡評価

必要がない場合はフォールバック値をスキップする、カスタムのデフォルト値関数です:

func orElse<T>(_ value: T?, _ fallback: @autoclosure () -> T) -> T {
    value ?? fallback()
}
func makeDefault() -> Int { print("built"); return 0 }
print(orElse(5, makeDefault()))  // 5  -- "built" never prints

assert スタイルのメッセージを遅延する

チェックに失敗した場合にだけメッセージを作成します:

func check(_ cond: Bool, _ msg: @autoclosure () -> String) {
    if !cond { print("FAIL: \(msg())") }
}
check(true, "this is never built")
check(false, "boom")  // FAIL: boom

オートクロージャーとエスケープ

@escapingと組み合わせると、遅延された式を後で使うために保存できます:

var thunks: [() -> Int] = []
func defer2(_ expr: @autoclosure @escaping () -> Int) {
    thunks.append(expr)
}
defer2(1 + 1)
print(thunks[0]())  // 2  -- computed on demand

呼び出し側のコードを読みやすくする

メリットは純粋に構文上のものです。呼び出し側は値を記述し、関数はクロージャーを受け取ります:

func unless(_ cond: Bool, _ value: @autoclosure () -> String) -> String {
    cond ? "skipped" : value()
}
print(unless(false, "shown"))  // "shown"

使わないほうがよい場合

オートクロージャーは、引数がクロージャーであることを隠すため、読者を戸惑わせることがあります。高コストなデフォルト値の計算を避ける場合など、遅延評価が本当に役立つときだけ、控えめに使ってください。

func first<T>(_ a: T?, _ b: @autoclosure () -> T) -> T { a ?? b() }
print(first(nil, 99))  // 99

オートクロージャーは引数を受け取りません

オートクロージャーは常に() -> Tという形式で、1つの式をラップし、パラメーターを受け取ることはできません:

func once(_ make: @autoclosure () -> [Int]) -> Int {
    make().count
}
print(once([1, 2, 3]))  // 3

クイックチェック

@autoclosureは引数に対して何を行いますか?

まとめ

オートクロージャーについて学びました:

  • @autoclosureは引数の式を() -> Tクロージャーでラップします
  • 式は関数が呼び出したときにだけ実行されます — これが遅延評価です
  • &&、||、??、assertで使われています
  • @escapingと組み合わせて保存できますが、読みやすさのために控えめに使ってください

コース完了です!次は、Equatable、Hashable、Comparableです。

よくある質問

「オートクロージャ」レッスンは無料ですか?

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

「オートクロージャ」で何を学びますか?

@autoclosureで式の評価を遅延させます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「オートクロージャ」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. 参照による値のキャプチャ
  2. エスケapingクロージャ
  3. キャプチャリストとweak self
  4. オートクロージャ
← Swift Academyに戻る