kuluna.class
Qiita

KotlinのLocal Function

Categories: Android

人間の設計というのはワガママで、このへんまとめて一つの関数にできるぐらいなんだけど、ここでしか使わないんだよなぁ・・・という時があります。
そんな時に使えるのがKotlinの Local Function というものです。

簡単にいうと、関数の中に関数を定義できます。

例えばAPIにデータを更新かけに行く時、APIのレスポンスを待ってUIの更新をすることが多いでしょう。 ですが、APIのレスポンスを待たずにUIの更新をかければユーザーは待たされることなくユーザー体験をより良いものとすることができます。

この時のUI処理はどちらも同じことをやるでしょう。これが1行で済めば良いのですが、たまに値の変換やソートをかける必要がある場合、同じ処理を2回書かなければならなくなります。

fun update(udateData: Any) {
  // APIを待たずにUI反映
  hoge(udateData)
  huga(udateData)

  api.call(updateData) { response ->
    response.ok?.let  { data ->
      // APIのレスポンスをUIに反映
      hoge(data)
      huga(data)
    }

    response.error?.let {
      // エラー処理
    }
  }
}

ではこれをLocal Functionでまとめてみましょう。
Local Functionは呼び出す時より前に定義する必要があります。

fun update(udateData: Any) {
  // このへんがLocal Function
  fun updateUI(data: Any) {
    hoge(data)
    huga(data)
  }

  // APIを待たずにUI反映
  updateUI(updateData)

  api.call(updateData) { response ->
    response.ok?.let  { data ->
      // APIのレスポンスをUIに反映
      updateUI(data)
    }

    response.error?.let {
      // エラー処理
    }
  }
}

このLocal Functionはスコープがupdate()の中なので、これより外の関数やクラスはupdateUIを呼び出すことはできません。まさにこの関数限定の関数という感じですね。

公式のリファレンスには特にバージョンいくつからと書いてないのでもしかしたら1.0.0の時点でLocal Functionが使えてたのかもしれません。
Functions/ infix, vararg, tailrec - Kotlin Programming Language