swift tailing Clouser テーリングクロージャ-(末尾のクロージャー)

関数の最後の引数としてクロージャ式を関数に渡す必要があり、クロージャ式が長い場合は、代わりに末尾のクロージャとして記述すると便利です。

それを テーリングクロージャー と言います。 末尾のクロージャはまだ関数の引数ですが、関数呼び出しの括弧の後に末尾のクロージャを記述します。

末尾のクロージャ構文を使用する場合、関数呼び出しの一部として最初のクロージャの引数ラベルを記述しません。

関数呼び出しには、複数の末尾のクロージャを含めることができます。

関数定義:フォトギャラリーを読み込む関数

completionのあとに2つのクロージャーが呼ばれている

1つは (Picture)->Void 2つ目は onFailure: () -> Void

func loadPicture(from server: Server, completion: (Picture) -> Void, onFailure: () -> Void) {

//画像が取得できた場合の処理
    if let picture = download("photo.jpg", from: server) {
        completion(picture)
    } else {

//画像が取得できなかった場合の処理
        onFailure()
    }
}

上記関数の呼び出し

1つめの引数は通常通り記載します。その他のクロージャー引数は、1度関数を閉じて {からクロージャーを記載します。

loadPicture(from: someServer) { picture in

//関数定義でpictureがあることは、担保されている=>後述で説明
    someView.currentPicture = picture

//失敗したときの処理
} onFailure: {
    print("Couldn't download the next picture.")
}

関数定義での、画像データの担保について

バインディングという if let を使います

//画像が取得できた場合の処理
    if let picture = download("photo.jpg", from: server) {

if let picture = "your_variable"{

//your_variableに値があったら pictureに詰め込む なかったら else以下を実行

参考にさせていただきました。 Closures — The Swift Programming Language (Swift 5.3)