escapingとnon-escaping、autoclosure
non-escaping(デフォルト)クロージャと@escaping(保存または戻り値の後に使用される)クロージャの違いを理解し、遅延評価を行う@autoclosureで呼び出し側を簡潔にします。
「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 closureAutoclosure + 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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- クロージャとキャプチャの基本
- キャプチャリスト — weak/unownedと値のキャプチャ
- escapingとnon-escaping、autoclosure