コード実行が現在のコードブロックを抜ける直前に、いくつかのステートメントが実行されるように defer
文を使用します。これにより、現在のコードブロックを抜けた理由が、エラーがスローされたことによるか、return
や break
文によるかにかかわらず、必要なクリーンアップを実行させることができます。例えば、defer
文を使用することで、ファイル記述子を閉じ、手動で割り当てられたメモリを解放することができます。
defer
文は、現在のスコープから抜ける直前まで実行を延期します。また、defer
キーワードと、後で実行されるコードブロックで構成されます。延期されたコードブロックは、break
や return
文、あるいはエラーをスローするような、コードブロックの外に制御を転送するコードを含みません。延期された処理は、指定されたのと逆の順序で実行されます。つまり、最初の defer
文のコードは、2 番目のコードの後に実行されることになります。
func processFile(filename: String) throws {
if exists(filename) {
let file = open(filename)
defer {
close(file)
}
while let line = try file.readline() {
// ファイルを扱う。
}
// スコープの最後のここで close(file) が呼び出される。
}
}
この例では、関数 open(_:)
に対応する close(_:)
を呼び出すために defer
文を使用しています。
NOTE
エラー処理のコードに関連しない場合でも、
defer
文を使用することができます。
Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.