Swift でローカルスコープを作る
Swift プログラミング
Swift だと変数をついつい let で定義したくなりますが、var の方がすっきりすることもあります。
そんなとき、var 変数がいつまでもスコープ内に居残ることが気になったので、任意の場所でスコープを定義できるようにしてみました。
Swift言語
を使っていると、ついつい変数をlet
だけでプログラムを組み立てたくなりますが、ときにはvar
を使ったほうがコードがすっきりしたりもします。
とはいえ、スコープにずっとvar
が居残るのも心地が良くないので、最低限の範囲に限定できるようにローカルスコープを作ってみました。
ローカルスコープを作成する
Swift言語 の場合、波括弧を単独で書いてスコープを作ることができませんが、クロージャーを使うことでローカルスコープを実現できます。
クロージャー内ではその内部だけで使う変数を自由に定義できますし、クロージャーの特性として『同一スコープにある変数が自動でキャプチャされる』というのがあるので、スコープ内の変数を自由に引き継いで読み書きできる状態のまま、クロージャー内だけに閉じた変数を自由に利用できます。
即席でスコープを作ると煩雑
ただ、即席でクロージャーを使おうとすると、余計に表記が複雑になります。
var a = 10
_ = { () -> () in
var b = 100
a += b
}()
まず、波括弧をいきなり書くことができないので、クロージャーを変数 _
に代入します。
それだけだとクロージャーが実行されずに捨てられるだけなので、最後に波括弧を閉じるのと合わせて、引数『 () 』を渡してクロージャーをすぐに実行します。
このとき『 () 』を『 } 』の隣に書かないと期待通りに実行されないのが『非常に注意』です。
これで、上記の例なら変数a をクロージャー内部から読み書きできて、変数b をクロージャー内に閉じることができますが、クロージャーの定義が煩雑でむしろコードが読みにくくも感じます。
このようなローカルスコープを頻繁に作りたい場合には、ひとつ関数を定義しておくと、扱いがスマートになります。
スコープを定義する関数を実装する
スコープを定義する関数の実装は簡単で、引数にクロージャー () -> () をとる関数を定義します。
func scope(statements:() -> ()) {
statements()
}
このように、何も引数を取らず何も返さないクロージャーを受け取って、それを関数内で実行します。
このような関数を用意することで、次のようにスマートにローカルスコープを生成できます。
var a = 10
scope {
var b = 100
a += b
}