Can I Swift? その2 – 変わる変数、変わらない変数

in Swift

プログラムで値を一時的に保持するためにローカル変数というものが用いられますが、私はこの変数の用途は大きく2つあると思っています。 変わる変数としての用途と変わらない変数としての用途です。 変わる方はいいとして変数なのに変わらないなんて矛盾した呼び方ですね。 具体的なコードで見ていきたいと思います。

変わらない変数 in Objective-C

次のコードは実際にLadioCastにあるクラスメソッドで、エラーメッセージをダイアログボックスとして表示する部分です。

+ (NSInteger)alertUserInfo:(NSDictionary *)userInfo {
	// close current alert panel
	[NSApp abortModal];
	if (userInfo == nil) {
		return 0;
	}
	// show new alert panel
	NSString * const messageText = [userInfo objectForKey:NSLocalizedDescriptionKey];
	NSString * const informativeText = [userInfo objectForKey:NSLocalizedRecoverySuggestionErrorKey];
	NSAlert * const alert = [[[NSAlert alloc] init] autorelease];
	alert.messageText = messageText;
	alert.informativeText = informativeText;
	alert.alertStyle = NSCriticalAlertStyle;
	NSInteger const response = [alert runModal];
	
	return response;
}

コードの8,9,10,14行目でローカル変数を定義していますが、全部にconstという修飾子がついています。 constというのは設定された初期値から値を変更できないようにする修飾子で、いわゆる定数を宣言するためのものです。 一般にプログラムで定数というとプログラムを書いた時点で既に値が定まっているようなものが典型的です。 それとは対照的にconstがついたローカル変数は、その処理が実行される間だけ存在しかつその間だけ値が変わらないものになります。 つまりここで使われているローカル変数は全て最初から最後まで値を変えずに役目を終えるわけです。

実際のプログラムにおいてローカル変数に保持された値が最初から最後まで変更されない場合は意外なほど多く、これらは変数といえどもある値に扱いやすい名前、いわば別名を割り当てているだけ、といえます。 変わらない変数という考え方は、このような別名を割り当てているだけの変数を通常の変数と意識して区別しよう、という考え方です。 変わらないものとして区別することでプログラムがより理解しやすくなり、プログラマの精神的な負担が軽減されます。 この区別をObjective-Cの場合はconst修飾子の付加で行うことができましたが、さてSwiftの場合ではどうでしょうか。

変わらない変数 in Swift

うれしいことにSwiftではこの区別をよりはっきりつけることができます。 前出のコードをSwiftで書き直してみましょう。

class func alertUserInfo(userInfo:NSDictionary!) -> Int {
	// close current alert panel
	NSApp.abortModal()
	if !userInfo {
		return 0
	}
	// show new alert panel
	let messageText:String = userInfo.objectForKey(NSLocalizedDescriptionKey) as String
	let informativeText:String = userInfo.objectForKey(NSLocalizedRecoverySuggestionErrorKey) as String
	let alert:NSAlert = NSAlert()
	alert.messageText = messageText
	alert.informativeText = informativeText
	alert.alertStyle = .CriticalAlertStyle
	let response:Int = alert.runModal()

	return response
}

Swiftでは変わらない変数をletで定義することができます。 (それに対して変わる変数はvarで定義します。)

私はあるプログラミング言語が使える言語かどうか仕様を見る際、このように変わる変数と変わらない変数を区別して書けるかどうかを重要項目の1つとしてチェックします。 その意味でSwiftはこのチェックに難なく合格してくれました。

次回はもう少しこのテーマを掘り下げてみたいと思います。 ではでは。

Leave a Reply

*