Swift Academy · レッスン

escapingとnon-escaping、autoclosure

non-escaping(デフォルト)クロージャと@escaping(保存または戻り値の後に使用される)クロージャの違いを理解し、遅延評価を行う@autoclosureで呼び出し側を簡潔にします。

レッスン 3/38 ステップ

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

概要

目標: クロージャがデフォルトのnon-escapingなのか、保存または非同期実行される@escapingなのかを理解し、@autoclosureによって呼び出し側を簡潔にする方法を学びます。

non-escapingがデフォルト

クロージャパラメータはデフォルトでnon-escapingです。関数が戻る前に呼び出され、保存されることはありません。

// Non-escaping by default: used immediately inside the function.
func applyTwice(_ f: (Int) -> Int, to x: Int) -> Int {
    return f(f(x))   // called synchronously; not stored
}
let doubled = applyTwice({ $0 * 2 }, to: 3)
print(doubled)  // 12

エスケープするクロージャ

クロージャを保存する場合や、関数の戻り後に実行する場合(タイマーや非同期処理など)は、パラメータに@escapingを付けます。

// Need @escaping when storing for later use:
var tasks: [() -> Void] = []

func addTask(_ work: @escaping () -> Void) {
    tasks.append(work)  // stored to run later
}

addTask { print("run later") }
tasks.forEach { $0() }

非同期完了処理

非同期APIは通常、関数が戻った後に呼び出される@escapingの完了ハンドラーを受け取ります。

func fetchData(completion: @escaping (String) -> Void) {
    // simulate async: call completion in the future
    // (In real apps, use DispatchQueue or URLSession)
    completion("done")  // still escaping by contract (may be called later)
}
fetchData { result in print(result) }

Autoclosure

@autoclosureを使うと、呼び出し側はクロージャを記述せずに式を渡せるため、可読性が向上します。

// @autoclosure converts an expression into () -> Bool automatically.
func logIf(_ condition: @autoclosure () -> Bool) {
    if condition() { print("Condition is true") }
}

let x = 3
logIf(x > 1)       // no braces needed; expression is turned into a closure

Autoclosure + escaping

@autoclosure @escapingは渡された式を保存し、後で評価します。キャプチャされた状態と評価のタイミングに注意してください。

// You can combine @autoclosure with @escaping:
// (be careful: the expression is captured and evaluated later)
var checks: [() -> Bool] = []

func enqueueCheck(_ condition: @autoclosure @escaping () -> Bool) {
    checks.append(condition)   // stored to run later
}

var threshold = 10
enqueueCheck(threshold > 5)   // captures current variable by reference semantics
threshold = 3
print(checks.map { $0() })    // re-evaluates with updated threshold

エスケープのルール

確認: @escapingが必要になるのはいつですか?

まとめ

まとめ: クロージャはデフォルトでnon-escapingです。保存する場合や後で呼び出す場合は@escapingを使用します。呼び出し側を簡潔にするには@autoclosureを使用し、@escapingとの組み合わせには注意します。

無料で開始

AI チューターと学ぶ Swift — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
122
レッスン
409

よくある質問

「escapingとnon-escaping、autoclosure」レッスンは無料ですか?

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

「escapingとnon-escaping、autoclosure」で何を学びますか?

non-escaping(デフォルト)クロージャと@escaping(保存または戻り値の後に使用される)クロージャの違いを理解し、遅延評価を行う@autoclosureで呼び出し側を簡潔にします。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「escapingとnon-escaping、autoclosure」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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