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	
}