オートクロージャ
@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 printsassert スタイルのメッセージを遅延する
チェックに失敗した場合にだけメッセージを作成します:
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フィードバックを取得できます。ローカル設定は不要です。